openCV 形态学 腐蚀、膨胀、开操作和比操作、形态梯度 、顶帽、黑帽



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

       形态学函数的头文件:#include <opencv2/imgproc/imgproc.hpp>
       函数定义如下:
  1. //! erodes the image (applies the local minimum operator)  
  2. CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,  
  3.                          Point anchor=Point(-1,-1), int iterations=1,  
  4.                          int borderType=BORDER_CONSTANT,  
  5.                          const Scalar& borderValue=morphologyDefaultBorderValue() );  
  6.   
  7. //! dilates the image (applies the local maximum operator)  
  8. CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,  
  9.                           Point anchor=Point(-1,-1), int iterations=1,  
  10.                           int borderType=BORDER_CONSTANT,  
  11.                           const Scalar& borderValue=morphologyDefaultBorderValue() );  
  12.   
  13. //! applies an advanced morphological operation to the image  
  14. CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,  
  15.                                 int op, InputArray kernel,  
  16.                                 Point anchor=Point(-1,-1), int iterations=1,  
  17.                                 int borderType=BORDER_CONSTANT,  
  18.                                 const Scalar& borderValue=morphologyDefaultBorderValue() );  
//! 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() );

开运算 (Opening)
  • 开运算是通过先对图像腐蚀再膨胀实现的。

    dst = open( src, element) = dilate( erode( src, element ) )

  • 能够排除小团块物体(假设物体较背景明亮)

  • 请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。

    Opening

闭运算(Closing)

  • 闭运算是通过先对图像膨胀再腐蚀实现的。

    dst = close( src, element ) = erode( dilate( src, element ) )

  • 能够排除小型黑洞(黑色区域)。

    Closing example

形态梯度(Morphological Gradient)

  • 膨胀图与腐蚀图之差

    dst = morph_{grad}( src, element ) = dilate( src, element ) - erode( src, element )

  • 能够保留物体的边缘轮廓,如下所示:

    Gradient

顶帽(Top Hat)

  • 原图像与开运算结果图之差

    dst = tophat( src, element ) = src - open( src, element )

    Top Hat

黑帽(Black Hat)

  • 闭运算结果图与原图像之差

    dst = blackhat( src, element ) = close( src, element ) - src

    Black Hat

二、形态学函数解析

        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(关闭)
Gradient: MORPH_GRADIENT(梯度)
Top Hat: MORPH_TOPHAT(顶帽)        Black Hat: MORPH_BLACKHAT(黑帽)
                              
                  InputArray kernel,  结构元素

                  Point anchor=Point(-1,-1),  结构元素的原点 
                                   int iterations=1,  迭代次数

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

        程序对源图像进行多种形态学处理,不同参数的膨胀(如函数默认的结构元素是3x3,改为7x7,还可以设置多次迭代),腐蚀,打开,关闭,以及开关的级联。
 
  1. #include <opencv2/core/core.hpp>  
  2. #include <opencv2/imgproc/imgproc.hpp>  
  3. #include <opencv2/highgui/highgui.hpp>  
  4.   
  5. int main()  
  6. {  
  7.     // Read input image  
  8.     cv::Mat image= cv::imread("binary.bmp");  
  9.     if (!image.data)  
  10.         return 0;   
  11.   
  12.     // Display the image  
  13.     cv::namedWindow("Image");  
  14.     cv::imshow("Image",image);  
  15.   
  16.     // Erode the image  
  17.     cv::Mat eroded;  
  18.     cv::erode(image,eroded,cv::Mat());  
  19.   
  20.     // Display the eroded image  
  21.     cv::namedWindow("Eroded Image");  
  22.     cv::imshow("Eroded Image",eroded);  
  23.     cv::imwrite("eroded.bmp",eroded);  
  24.   
  25.     // Dilate the image  
  26.     cv::Mat dilated;  
  27.     cv::dilate(image,dilated,cv::Mat());  
  28.   
  29.     // Display the dialted image  
  30.     cv::namedWindow("Dilated Image");  
  31.     cv::imshow("Dilated Image",dilated);  
  32.     cv::imwrite("dilated.bmp",dilated);  
  33.   
  34.     // Erode the image with a larger s.e.  
  35.     cv::Mat element(7,7,CV_8U,cv::Scalar(1));  
  36.     cv::erode(image,eroded,element);  
  37.   
  38.     // Display the eroded image  
  39.     cv::namedWindow("Eroded Image (7x7)");  
  40.     cv::imshow("Eroded Image (7x7)",eroded);  
  41.     cv::imwrite("Eroded Image 7x7.bmp",eroded);  
  42.   
  43.     // Erode the image 3 times.  
  44.     cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);  
  45.   
  46.     // Display the eroded image  
  47.     cv::namedWindow("Eroded Image (3 times)");  
  48.     cv::imshow("Eroded Image (3 times)",eroded);  
  49.     cv::imwrite("Eroded Image 3 times.bmp",eroded);  
  50.   
  51.     // Close the image  
  52.     cv::Mat element5(5,5,CV_8U,cv::Scalar(1));  
  53.     cv::Mat closed;  
  54.     cv::morphologyEx(image,closed,cv::MORPH_CLOSE,element5);  
  55.       
  56.     // Display the opened image  
  57.     cv::namedWindow("Closed Image");  
  58.     cv::imshow("Closed Image",closed);  
  59.     cv::imwrite("Closed Image.bmp",closed);  
  60.   
  61.     // Open the image  
  62.     cv::Mat opened;  
  63.     cv::morphologyEx(image,opened,cv::MORPH_OPEN,element5);  
  64.   
  65.     // Display the opened image  
  66.     cv::namedWindow("Opened Image");  
  67.     cv::imshow("Opened Image",opened);  
  68.     cv::imwrite("Opened Image.bmp",opened);  
  69.   
  70.     // Close and Open the image  
  71.     cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);  
  72.     cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);  
  73.   
  74.     // Display the close/opened image  
  75.     cv::namedWindow("Closed and Opened Image");  
  76.     cv::imshow("Closed and Opened Image",image);  
  77.     cv::imwrite("Closed and Opened Image.bmp",image);  
  78.   
  79.     // Read input image  
  80.     image= cv::imread("binary.bmp");  
  81.   
  82.     // Open and Close the image  
  83.     cv::morphologyEx(image,image,cv::MORPH_OPEN,element5);  
  84.     cv::morphologyEx(image,image,cv::MORPH_CLOSE,element5);  
  85.   
  86.     // Display the close/opened image  
  87.     cv::namedWindow("Opened and Closed Image");  
  88.     cv::imshow("Opened and Closed Image",image);  
  89.     cv::imwrite("Opened and Closed Image.bmp",image);  
  90.   
  91.     cv::waitKey();  
  92.     return 0;  
  93. }  
#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先关闭再打开

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值