OpenCV图像腐蚀函数erode()的使用

OPenCV版本:4.4
IDE:VS2017

功能描述

通过一个特定的结构元素腐蚀一个图像。图像腐蚀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所覆盖元素的最小值替换B的中心位置值(即锚点处),完成整个腐蚀的过程。

注意:所谓的腐蚀与膨胀的对象是针对图像中的白色元素所说的。看成是图像中的物体话会理解反。

算法通俗理解:腐蚀算法使二值图像缩小一圈,删除对象边界的某些像素,其运算过程就是使用用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为1,结构图像的该像素为1,否则为0。结果就是使二值图像减小一圈。

函数使用一个指定的核元素去腐蚀源图像,内核有一个可定义的 锚点,我们叫他内核中心点,腐蚀操作时,获取内核覆盖区域最小像素值,并代替锚点的像素,最小值通过以下公式获取:
dst ( x , y ) = min ⁡ ( x ′ , y ′ ) :   element ( x ′ , y ′ ) ≠ 0 src ( x + x ′ , y + y ′ ) \texttt{dst} (x,y) = \min _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y') dst(x,y)=(x,y):element(x,y)=0minsrc(x+x,y+y)
函数支持就地模式,腐蚀操作可以迭加使用多次,在多通道图像的情况下,每个通道独立处理。

函数原型

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

参数描述

  • 参数 src 输入图像;通道的数量可以是任意的,但是深度值应该是以下之一:
    CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.

  • 参数 dst 和源图像同样大小和类型的输出图像。

  • 参数 kernel 用于腐蚀的结构元素;如果element=Mat(),是一个3 x 3的矩形结构元素. Kernel 可以通过使用getStructuringElement来创建。

  • 参数 anchor 素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。

  • 参数 iterations 腐蚀的迭代次数。

  • 参数 borderType像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。

  • 参数 borderValue 固定边缘的情况下的边缘值。

    参考 dilate, morphologyEx, getStructuringElement

源码示例:

#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    
    
	cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");
	if (image.empty())
	{
    
    
		std::cout << "image read failed!" << std::endl;
		cv::waitKey(0);
		return 0;
	}
	cv::Mat imageDst;
	//自定义核
	cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(8, 8));
	cv::imshow("原图", image);
	cv::erode(image, imageDst, element);
	cv::imshow("腐蚀", imageDst);
	cv::waitKey(0);
	return 0;
}

运行结果:

在这里插入图片描述

可见果汁杯边缘变粗,水果的颜色变深,边缘变粗。

猜你喜欢

转载自blog.csdn.net/jndingxin/article/details/113743671
今日推荐