OpenCV(cv::erode())



cv::erode() 是 OpenCV 中的图像形态学变换函数之一,用于执行图像的腐蚀操作。腐蚀是一种将图像中的白色区域缩小的操作,通常用于去除噪声、分离相邻的物体,或将小的图像细节消除。



1. 函数定义

void cv::erode(
    InputArray src, 
    OutputArray dst, 
    InputArray kernel, 
    Point anchor = Point(-1,-1), 
    int iterations = 1, 
    int borderType = BORDER_CONSTANT, 
    const Scalar& borderValue = morphologyDefaultBorderValue()
);

参数:

  1. srcInputArray 类型,表示输入的源图像。图像必须是单通道或多通道的二值图像或灰度图像。

  2. dstOutputArray 类型,表示输出的目标图像。目标图像的尺寸和类型与源图像相同。

  3. kernelInputArray 类型,表示腐蚀操作的结构元素(也叫做卷积核)。可以通过函数 cv::getStructuringElement() 来生成。这个核用于决定腐蚀的方式。常见的核包括矩形(MORPH_RECT)、椭圆形(MORPH_ELLIPSE)和十字形(MORPH_CROSS)等。kernel 的尺寸影响腐蚀效果,越大的核,腐蚀的效果越明显。

  4. anchorPoint 类型,表示腐蚀操作的锚点(即核的中心点)。默认值为 Point(-1, -1),这意味着锚点位于结构元素的中心。

  5. iterationsint 类型,表示腐蚀操作重复的次数。默认值是 1,如果需要更强的腐蚀效果,可以增大此值。

  6. borderTypeint 类型,指定边界的处理方式。

    • BORDER_CONSTANT:使用常数值填充边界。
    • BORDER_REPLICATE:重复最外边缘的像素。
    • BORDER_REFLECT:边界以镜像的方式反射。
  7. borderValueScalar 类型,仅当 borderTypeBORDER_CONSTANT 时使用,指定填充边界的值。



2. 工作原理

腐蚀操作:将卷积核在图像上滑动,滑动到每个位置时,计算卷积核覆盖区域的最小值,并将最小值赋给目标图像中相应的位置。

换句话说,只有当卷积核完全覆盖在图像的前景(白色部分)上时,输出像素才会保留原样,否则会被腐蚀。

假设有一个 3x3 的卷积核:

1 1 1
1 1 1
1 1 1

当该卷积核在图像上滑动时,核覆盖区域内的最小像素值将作为输出。如果在二值图像中,前景像素为 1,背景像素为 0,腐蚀会使前景变得更小,背景像素扩展。



3. 示例

以下是一个使用 cv::erode() 的 C++ 示例代码:

#include<iostream>
#include<opencv2/opencv.hpp>
#include<ctime>
using namespace std;
using namespace cv;
int main(void)
{
	cv::Mat test = cv::Mat::zeros(64, 64, CV_8UC1);
	cv::rectangle(test, cv::Rect(30, 30, 5, 5), 255, -1);
 
	cv::Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	cv::Mat result;
	cv::erode(test, result, element);
 
	imshow("original", test);
	imshow("result", result);
	waitKey(0);
 
	system("pause");
	return 0;
}

输出:

在这段代码中,我们使用 getStructuringElement() 创建了一个 3x3 的矩形卷积核,然后调用 erode() 对图像进行腐蚀。腐蚀后的图像中,白色区域会缩小。



4. 应用场景

  • 去除噪声:腐蚀可以用来去除图像中的小噪声点(如在二值化处理后的图像中)。
  • 分离物体:如果图像中的两个物体彼此接触,通过腐蚀可以使它们分开。
  • 形态学梯:腐蚀和膨胀操作可以结合使用,获取图像的形态学梯度(即边缘)。


总结

cv::erode() 是一种常用于图像处理的形态学操作,主要功能是缩小图像中的前景对象。通过调整结构元素的大小和形状,可以控制腐蚀的程度和方向。在实际应用中,它通常与其他形态学操作如膨胀(cv::dilate())结合使用,完成更复杂的图像处理任务。



posted @ 2024-09-14 11:47  做梦当财神  阅读(158)  评论(0编辑  收藏  举报