二值形态学(膨胀,腐蚀,开启,关闭)的opencv实现

一、opencv几个形态学函数定义

       形态学函数的头文件:#include <opencv2/imgproc/imgproc.hpp>
       函数定义如下:
//! erodes the image (applies the local minimum operator)
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() );

//! dilates the image (applies the local maximum operator)
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor=Point(-1,-1), int iterations=1,
                          int borderType=BORDER_CONSTANT,
                          const Scalar& borderValue=morphologyDefaultBorderValue() );

//! applies an advanced morphological operation to the image
CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor=Point(-1,-1), int iterations=1,
                                int borderType=BORDER_CONSTANT,
                                const Scalar& borderValue=morphologyDefaultBorderValue() );

二、形态学函数解析

        erode腐蚀函数): InputArray src,  原图像
                                 OutputArray dst,  结果输出图像
                               InputArray kernel,  结构元素
                  Point anchor=Point(-1,-1),  结构元素的原点 
                                   int iterations=1,  迭代次数

    dilate(膨胀函数):
InputArray src,  原图像

                                 OutputArray dst,  结果输出图像
                               InputArray kernel,  结构元素
                  Point anchor=Point(-1,-1),  结构元素的原点 
                                   int iterations=1,  迭代次数

     
      
morphologyEx(形态学函数):InputArray src,  原图像

                                 OutputArray dst,  结果输出图像
                                                 int op,cv::MORPH_OPEN(打开) cv::MORPH_CLOSE(关闭)
                               InputArray kernel,  结构元素
                  Point anchor=Point(-1,-1),  结构元素的原点 
                                   int iterations=1,  迭代次数

三、形态学函数使用举例及结果分析

         程序对源图像进行多种形态学处理,不同参数的膨胀(如函数默认的结构元素是3x3,改为7x7,还可以设置多次迭代),腐蚀,打开,关闭,以及开关的级联。
 
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main()
{
	// Read input image
	cv::Mat image= cv::imread("binary.bmp");
	if (!image.data)
		return 0; 

    // Display the image
	cv::namedWindow("Image");
	cv::imshow("Image",image);

	// Erode the image
	cv::Mat eroded;
	cv::erode(image,eroded,cv::Mat());

    // Display the eroded image
	cv::namedWindow("Eroded Image");
	cv::imshow("Eroded Image",eroded);
	cv::imwrite("eroded.bmp",eroded);

	// Dilate the image
	cv::Mat dilated;
	cv::dilate(image,dilated,cv::Mat());

    // Display the dialted image
	cv::namedWindow("Dilated Image");
	cv::imshow("Dilated Image",dilated);
	cv::imwrite("dilated.bmp",dilated);

	// Erode the image with a larger s.e.
	cv::Mat element(7,7,CV_8U,cv::Scalar(1));
	cv::erode(image,eroded,element);

    // Display the eroded image
	cv::namedWindow("Eroded Image (7x7)");
	cv::imshow("Eroded Image (7x7)",eroded);
	cv::imwrite("Eroded Image 7x7.bmp",eroded);

	// Erode the image 3 times.
	cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);

    // Display the eroded image
	cv::namedWindow("Eroded Image (3 times)");
	cv::imshow("Eroded Image (3 times)",eroded);
	cv::imwrite("Eroded Image 3 times.bmp",eroded);

	// Close the image
	cv::Mat element5(5,5,CV_8U,cv::Scalar(1));
	cv::Mat closed;
	cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);
	
    // Display the opened image
	cv::namedWindow("Closed Image");
	cv::imshow("Closed Image",closed);
	cv::imwrite("Closed Image.bmp",closed);

	// Open the image
	cv::Mat opened;
	cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5);

    // Display the opened image
	cv::namedWindow("Opened Image");
	cv::imshow("Opened Image",opened);
	cv::imwrite("Opened Image.bmp",opened);

	// Close and Open the image
	cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);
	cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);

    // Display the close/opened image
	cv::namedWindow("Closed and Opened Image");
	cv::imshow("Closed and Opened Image",image);
	cv::imwrite("Closed and Opened Image.bmp",image);

	// Read input image
	image= cv::imread("binary.bmp");

	// Open and Close the image
	cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);
	cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);

    // Display the close/opened image
	cv::namedWindow("Opened and Closed Image");
	cv::imshow("Opened and Closed Image",image);
	cv::imwrite("Opened and Closed Image.bmp",image);

	cv::waitKey();
	return 0;
}

四、程序结果显示和分析:
binary.bmp(源图像)
eroded.bmp  (腐蚀)消除一些小的噪声 
dilated.bmp(膨胀)填充物体的空洞,膨胀物体
Eroded Image 7x7.bmp(腐蚀,结构元素尺寸是7x7)相比结构元素为默认3x3的相比,源图像的噪声跟大点的噪声也消失了
Eroded Image 3 times.bmp(腐蚀 3次迭代)迭代后结果不变
Opened Image.bmp(先腐蚀后膨胀)消除小噪声,然后再膨胀,平滑大物体,分离小物体
Closed Image.bmp(关闭 先膨胀在腐蚀)填充细小空洞,连接相邻物体,平滑边界
Opened and Closed Image.bmp 先打开在关闭
Closed and Opened Image.bmp先关闭再打开
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV中,膨胀(Dilation)和腐蚀(Erosion)是形态学处理方法的两个基本操作。它们常常配合使用,可以用于图像处理中的各种应用。 膨胀是一种形态学操作,它可以扩展图像中的亮区域(白色区域)并连接相邻的亮像素。膨胀操作通过滑动一个结构元素(kernel)在图像上,将结构元素覆盖的所有像素中的最大值作为输出。膨胀操作可以用于填充图像中的空洞、连接断开的边缘、增加目标的大小等。它对于去除小的噪点和分离不相连的对象也有一定效果。 腐蚀是一种形态学操作,它可以缩小图像中的亮区域并分离相邻的亮像素。腐蚀操作通过滑动一个结构元素在图像上,将结构元素覆盖的所有像素中的最小值作为输出。腐蚀操作可以用于去除图像中的细小干扰、分离重叠的对象、减小目标的大小等。它对于去除细节和平滑图像边界也有一定效果。 膨胀腐蚀操作可以根据结构元素的形状和大小来调整其效果。通过反复应用膨胀腐蚀操作,可以实现更复杂的形态学处理,例如开运算(Opening)和闭运算(Closing)等。开运算先进行腐蚀操作再进行膨胀操作,可以用于去除噪点;闭运算先进行膨胀操作再进行腐蚀操作,可以用于填充空洞。 总结起来,膨胀腐蚀形态学处理中最基本的操作,膨胀可以扩大亮区域并连接相邻像素,腐蚀可以缩小亮区域并分离相邻像素。它们在图像处理中被广泛应用于边缘检测、图像增强、噪声去除等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值