一、getStructuringElement()函数
作用是返回一个结构元素(卷积核),具体解析如下:
kernel = cv2.getStructuringElement(a,b,c):
得到一个结构元素(卷积核)。主要用于后续的腐蚀、膨胀、开、闭等运算。
因为这些运算都是依赖于卷积核的,不同的卷积核(形状、大小)对图形的腐蚀、膨胀操作效果不一样
a设定卷积核的形状、b设定卷积核的大小、c表示描点的位置,一般 c = 1,表示描点位于中心。
a取不同的参数会导致卷积核有不同的形状,a参数有三个:
①:MORPH_RECT(函数返回矩形卷积核)
②:MORPH_CROSS(函数返回十字形卷积核)
③:MORPH_ELLIPSE(函数返回椭圆形卷积核)
b:用一个Size(x,y)的形式表示,表示卷积核有x行,y列。
二、腐蚀操作 胖子变瘦 有黑周围变黑,有0都变0,白色变少
①:腐蚀操作的对象是二值化图像,二值图像前景物体为1,背景为0,卷积核也是只含有0和1。
腐蚀的步骤就是用卷积核B的描点,来对齐A中的每一个小方格,然后选取卷积核B的方格中的数据的最小值,意思就是当B的描点对齐A的边界方格的时候,那么B的其他四个方格可能位于A图像中的0像素点,那么最小值就是0,那么就把卷积核B的描点对应的A中的小方格设为0,这就导致使用腐蚀操作后,我我们能看到的白色区域减少的原因。
Mat kernel = cv2.getStructuringElement(a,b,c)
erode(img, dest,kernel, iteration = 1)# 腐蚀操作
三、膨胀操作 瘦子变胖子 有白周围变白
原理与腐蚀操作一样,是取最大像素值。
Mat getStructuringElement(a,b,c)
dilate(img,dst, kernel, iteration = 1)# 膨胀操作
四、开、闭
morphology英 [mɔːˈfɒlədʒɪ] 形态学
开:先进行腐蚀运算,再进行膨胀运算。
闭:先进行膨胀运算,再进行腐蚀运算。
getStructuringElement(kernel,a,b,c)
morphologyEx(img, dest,MORPH_OPEN,kernel) # 开运算
morphologyEx(ima,dest,MORPH_CLOSE,lernel) # 闭运算
开运算和闭运算都是处理噪点用的:
开:消去一个黑图中的很多小白点
闭:
闭运算=膨胀 +腐蚀
五、形态学梯度
gradient [ˈɡreɪdɪənt] 斜坡路段;坡度;倾斜度;梯度;斜率;梯度;
原图-腐蚀后的图=图的边框
//形态学梯度 原图-腐蚀后的图像= 图像轮廓
morphologyEx(src, dst, MORPH_GRADIENT, kernel);
六、顶帽操作
顶帽操作 原图-开运算=原图外噪声
morphologyEx(src, dst, MORPH_TOPHAT,kernel);
七、黑帽操作
黑帽操作 原图-闭运算=原图内噪声
morphologyEx(src, dst, MORPH_BLACKHAT, kernel);
五、注意点
1、 kernel 如果噪点比较多,会选择大一点的kernel,如果噪点比较小,可以选择小点的kernel
2、腐蚀是有黑都变黑
3、膨胀是有白都变白
4、开运算先黑再白,可以去除图形外部的噪声,消去一个黑图中的很多小白点
5、闭运算先白再黑,可以去除图形内部的噪声,消去一个白图中的很多小黑点
void myCV::morphologytest()
{
Mat ds,dst, src = imread("font2.jpg");
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
//腐蚀操作
//erode(src, dst, kernel);
//膨胀操作
//dilate(src, dst, kernel);
//开操作
//morphologyEx(src, dst, MORPH_OPEN, kernel);
//闭操作
morphologyEx(src, dst, MORPH_CLOSE,kernel);
morphologyEx(dst, dst, MORPH_OPEN, kernel);
addmatcols(src, dst, ds); //自定义函数将两个mat合并在一起
imshow("morphology", ds);
}