15人参与 • 2025-06-03 • C/C++
图像腐蚀 (erosion) 是形态学图像处理中的一种基本操作。它通常用于去除图像中的小型噪声、分离连接的物体以及细化二值图像中的物体。本文将详细介绍腐蚀的原理,并演示如何使用 c++ 和 opencv 库来实现图像腐蚀。
图像腐蚀可以被看作是用一个特定的结构元素(也称为核或掩模)“探测”或“扫描”输入图像的过程。对于二值图像,如果结构元素下的所有像素都为前景像素(通常为白色,值为1或255),则输出图像中结构元素锚点对应的像素才被置为前景像素,否则置为背景像素(通常为黑色,值为0)。对于灰度图像,输出像素的值是结构元素覆盖区域内所有像素的最小值。
简单来说,腐蚀操作会:
其效果就像是用结构元素“腐蚀”掉前景物体的边界。
结构元素是一个小的二值矩阵(或灰度矩阵),它定义了腐蚀操作的邻域范围和形状。结构元素的中心点通常被称为“锚点”。opencv 提供了 cv::getstructuringelement()
函数来方便地创建常见的结构元素。
常用的结构元素形状包括:
cv::morph_rect
: 矩形cv::morph_ellipse
: 椭圆形cv::morph_cross
: 十字形// 创建一个 5x5 大小的矩形结构元素 cv::mat kernel_rect = cv::getstructuringelement(cv::morph_rect, cv::size(5, 5)); // 创建一个 5x5 大小的椭圆形结构元素 cv::mat kernel_ellipse = cv::getstructuringelement(cv::morph_ellipse, cv::size(5, 5)); // 创建一个 5x5 大小的十字形结构元素 cv::mat kernel_cross = cv::getstructuringelement(cv::morph_cross, cv::size(5, 5));
结构元素的大小和形状对腐蚀结果有显著影响。
opencv 提供了 cv::erode()
函数来实现图像腐蚀。
函数原型:
void cv::erode( cv::inputarray src, // 输入图像 cv::outputarray dst, // 输出图像 cv::inputarray kernel, // 用于腐蚀的结构元素 cv::point anchor = cv::point(-1,-1), // 结构元素内锚点的位置。默认值 (-1,-1) 表示锚点在核中心。 int iterations = 1, // 腐蚀操作迭代次数 int bordertype = cv::border_constant, // 像素外推方法 const cv::scalar& bordervalue = cv::morphologydefaultbordervalue() //边界不变时的边界值 );
参数说明:
src
: 输入图像,可以是任意通道数的图像,但深度应为 cv_8u
, cv_16u
, cv_16s
, cv_32f
或 cv_64f
。dst
: 输出图像,与 src
具有相同的大小和类型。kernel
: 结构元素。如果传入一个空的 cv::mat()
,则默认使用一个 3x3 的矩形核。anchor
: 锚点位置。默认值 cv::point(-1,-1)
表示锚点在结构元素的中心。iterations
: 腐蚀操作执行的次数。多次迭代等同于使用一个由原始核通过自身膨胀(相应次数)得到的更大的核。bordertype
: 用于推断图像外部像素的边界模式。bordervalue
: 当 bordertype
为 cv::border_constant
时使用的边界值。下面是一个完整的 c++ 示例,演示了如何加载图像并对其进行腐蚀操作:
#include <opencv2/opencv.hpp> #include <iostream> int main(int argc, char** argv) { // 1. 加载图像 // 将 "your_image_path.png" 替换为你的图像路径 cv::mat srcimage = cv::imread("your_image_path.png", cv::imread_color); // 检查图像是否成功加载 if (srcimage.empty()) { std::cerr << "错误: 无法加载图像!" << std::endl; return -1; } // 2. 创建腐蚀后的输出图像 cv::mat erodedimage; // 3. 定义结构元素 (核) // 尝试不同的形状和大小 // int erosion_size = 3; // 核大小,可以调整 // cv::mat element = cv::getstructuringelement(cv::morph_rect, // cv::size(2 * erosion_size + 1, 2 * erosion_size + 1), // cv::point(erosion_size, erosion_size)); // 使用一个简单的 5x5 矩形核 cv::mat element = cv::getstructuringelement(cv::morph_rect, cv::size(5, 5)); // 你也可以尝试: // cv::mat element = cv::getstructuringelement(cv::morph_ellipse, cv::size(5, 5)); // cv::mat element = cv::getstructuringelement(cv::morph_cross, cv::size(5, 5)); // 如果不指定核,opencv 会默认使用一个 3x3 的矩形核 // cv::mat element; // 使用默认 3x3 核 // 4. 执行腐蚀操作 // 可以指定迭代次数,例如 iterations = 2 int iterations = 1; cv::erode(srcimage, erodedimage, element, cv::point(-1,-1), iterations); // 5. 显示原始图像和腐蚀后的图像 cv::imshow("原始图像", srcimage); cv::imshow("腐蚀后的图像", erodedimage); // 6. 等待用户按键,然后关闭窗口 cv::waitkey(0); cv::destroyallwindows(); return 0; }
编译和运行说明 (以 g++ 为例):
g++ your_source_file.cpp -o erode_example $(pkg-config --cflags --libs opencv4) ./erode_example
(请确保你已安装 opencv 并配置好 pkg-config,如果使用 opencv 3,将 opencv4
替换为 opencv
)
#include <opencv2/opencv.hpp>
: 包含了 opencv 的主要头文件。cv::imread("your_image_path.png", cv::imread_color)
: 加载指定路径的彩色图像。你需要将 "your_image_path.png"
替换为实际的图像文件路径。srcimage.empty()
: 检查图像是否成功加载。cv::getstructuringelement(cv::morph_rect, cv::size(5, 5))
: 创建一个 5x5 大小的矩形结构元素。你可以修改形状 (morph_ellipse
, morph_cross
) 和大小 (cv::size
) 来观察不同的效果。cv::erode(srcimage, erodedimage, element, cv::point(-1,-1), iterations)
: 对 srcimage
应用腐蚀操作,使用 element
作为结构元素,迭代 iterations
次,并将结果存储在 erodedimage
中。cv::point(-1,-1)
表示锚点在核的中心。cv::imshow()
: 显示原始图像和处理后的图像。cv::waitkey(0)
: 等待用户按下任意键。cv::destroyallwindows()
: 关闭所有 opencv 创建的窗口。iterations
):图像腐蚀是形态学图像处理中一个强大且基础的工具。通过选择合适的结构元素大小、形状以及迭代次数,可以有效地修改图像中物体的形状和大小,以达到去噪、分割和特征提取等目的。opencv 的 cv::erode()
函数为我们提供了一个简单易用的接口来实现这一功能。鼓励读者多多尝试不同的参数组合,观察它们对图像处理结果的具体影响。
到此这篇关于c/c++中opencv实现腐蚀的示例代码的文章就介绍到这了,更多相关opencv 腐蚀内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论