OpenCV基础(七)---形态学基础:腐蚀与膨胀

形态学图像处理

形态学是研究动植物形态(form)的科学。这里我们使用同一术语表示数学形态学的内容。

数学形态学(Mathematical morphology) 是一门建立在格论拓扑学基础之上的图像分析学科,

是数学形态学图像处理的基本理论。其基本的运算包括:腐蚀膨胀开运算闭运算

骨架抽取、极限腐蚀、击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换等

预备知识

对一副二值图像进行形态学处理,首先要定义结构元(SE),结构元的形状通常为矩形和圆形。

如图1,阴影部分为结构元B,白色部分是添加的最小可能的背景元素以构成矩形。

对图2,图像A进行一种形态学处理得到图3.

处理方法:结构元B在集合A上进行移动,若阴影部分完全重合,此时结构元的中心点,在新图像上标记为阴影.

可以看到,在边缘处,B不能完全包含在A中,最终边界被腐蚀掉了.

PS:灰度图像与此类似,定义方法不同

         

  图1 结构元                          图2 处理前                                                       图3  处理后 

膨胀

 集合A和集合B,A⊕B表示为B对A的膨胀,定义为,

这个公式,以B关于它原点的映像,并且以z对映像进行平移,B对A的膨胀是所有位移z的集合.

灰度形态学是二值形态学的扩展,研究对象是
灰度图像。在灰度形态学中,膨胀与腐蚀运算相当
于求局部最大值和最小值操作。膨胀与腐蚀运算
是其他形态学操作的基础,可利用灰度形态学膨胀
与腐蚀组成的形态学变换对灰度图进行滤波、边缘
检测、分割、纹理分析等。

灰度图的膨胀:

膨胀的目的是求局部最大值,即计算结构元素
在图像中所覆盖区域的像素点最大值,并把这个最大值赋给当前结构元素中心指定的像素.

腐蚀

集合A和集合B,A㊀B表示为B对A的腐蚀,定义为,

该式指出B对A的腐蚀是一个用z平移的B包含在A中所有的点z的集合.

灰度图的腐蚀:

腐蚀是膨胀的对偶操作,计算图像中被结构元素覆盖区域的最小像素值,

并把当前结构元素中心所在的像素置为最小值

函数介绍

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

函数功能:返回指定形状和大小的结构元

函数声明:

  • shape  结构元的形状,可以为cv::MorphShapes中的一种
  • ksize  结构元的尺寸
  • anchor  锚点默认为结构元中心,一般取默认
void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

函数功能:膨胀图像

参数声明略    

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

函数功能:腐蚀图像

参数声明略

代码

 1 #include <opencv2/opencv.hpp> 
 2 #include <iostream> 
 3 using namespace cv;
 4 using namespace std;
 5 Mat src, dst;
 6 char output_title[] = "dilate image";
 7 int element_size = 3;
 8 int max_size = 21;
 9 void CallBack_Demo(int, void*);
10 int main() {
11 
12     src = imread("D:/cat.png");
13     if (!src.data) {
14         cout << "could not load image..." << endl;
15         return -1;
16     }
17     imshow("input image", src);
18 
19     namedWindow(output_title, CV_WINDOW_AUTOSIZE);
20     createTrackbar("Element Size :", output_title, &element_size, max_size, CallBack_Demo);
21     CallBack_Demo(0, 0);
22 
23     waitKey(0);
24     return 0;
25 }
26 
27 void CallBack_Demo(int, void*) {
28     int s = element_size * 2 + 1;
29     Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
30     dilate(src, dst, structureElement, Point(-1, -1), 1);
31     //erode(src, dst, structureElement, Point(-1, -1), 1);
32     imshow(output_title, dst);
33     return;
34 }

效果对比图

  

   

原文地址:https://www.cnblogs.com/zmm1996/p/10678198.html