形态学图像处理
形态学是研究动植物形态(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 }
效果对比图