数学形态学是数学形态学图像处理的基本理论。其基本的运算包括:二值腐蚀和膨胀、二值开闭运算、骨架抽取、极限腐蚀
击中击不中变换、形态学梯度、Top-hat变换、颗粒分析、流域变换、灰值腐蚀和膨胀 灰值开闭运算、灰值形态学梯度
最基本的形态学操作为 膨胀(dilate)和腐蚀(erode)
膨胀就是求局部最大值的操作,会使图像中的高亮区域逐渐增长(变得更白)
腐蚀就是求局部最小值的操作,图像的高亮区域会逐渐减少
一般使用getStructingElement这个函数 配合相关API使用
getStructingElement函数会返回指定形状和尺寸的结构元素(内核矩阵)
第一个参数表示内核的形状
矩形:MORPH_RECT
交叉形:MORPH_CROSS
椭圆形:MORPH_ELLIPSE
第二个第三个参数分别是内核的尺寸和锚点的位置
一般在调用dilate或者erode函数之前先定义一个Mat类型的对象
来获取getStructingElement的返回值
对于锚点的位置,默认值point(-1,-1)即为中心点
Mat element;
element = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(Img1, Img2, element); //膨胀
imshow("dilate img", Img2);
erode(Img1, OutImg, element); //腐蚀
imshow("erode img", OutImg);
接下来介绍的函数是morphologyEx函数
他利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换
morphologyEx
第三个参数int类型的op表示形态学运算的类型
MORPH_OPEN --开运算
MORPH_CLOSE --闭运算
MORPH_GRADIENT --形态学梯度
MORPH_TOPHAT --顶帽
MORPH_BLACKHAT --黑帽
MORPH_ERODE --腐蚀
MORPH_DILATE --膨胀
第四个参数 kernel 内核
同样借助于getStructingElement
第五个参数是锚点的位置 point(-1,-1)表示正中
第六个参数表示函数迭代的次数 可能一次效果并不明显
开运算
其实就是先腐蚀后膨胀的过程(先变黑在变白)
开运算可以消除小的物体,在纤细处分离物体,
并且在平滑 较大物体的边界的同时不明显改变其面积
就是图像中有一些坑坑洼洼白色区块,可以有效去除掉。
Mat OpenImg;
morphologyEx(Img1, OpenImg, MORPH_OPEN, element);
imshow("Open img", OpenImg);
闭运算
其实就是先膨胀后腐蚀的过程(先变白后变黑)
闭运算可以排除小型黑洞(黑色区域)
Mat CloseImg;
morphologyEx(Img1, CloseImg, MORPH_CLOSE, element);
imshow("Close Img", CloseImg);
形态学梯度
形态学梯度是膨胀图与腐蚀图之差
对二值图像进行这一操作的时候可以将团块(blob)的边缘突出出来。
我们可以利用形态学梯度保留物体的边缘
Mat GradientImg;
morphologyEx(Img1, GradientImg, MORPH_GRADIENT, element);
imshow("Gradient Img", GradientImg);
顶帽
是 原图像与开运算操作的图像 之差
因为开运算带来的结果是放大了裂缝或者局部低亮度的区域。
从原图减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域
且这一操作与选择的核的大小相关
顶帽运算往往用来分离比邻近点亮一些的斑点。
在一幅图像具有大幅的背景,而微小物品比较有规律的情况下,可以使用顶帽进行背景提取
Mat Tophatimg;
morphologyEx(Img1, Tophatimg, MORPH_TOPHAT, element);
imshow("Tophat Img", Tophatimg);
黑帽
是 原图像与闭运算操作的图像 之差
黑帽运算后的效果图突出了比原图轮廓周围区域更暗的区域
且这一操作与选择的核的大小相关
黑帽运算用来分离比邻近点暗一些的斑块,效果图有着非常完美的轮廓。
Mat BlackHatImg;
morphologyEx(Img1, BlackHatImg, MORPH_BLACKHAT, element);
imshow("Blackhat Img", BlackHatImg);