形态学操作(morphology)
1.膨胀
描述:膨胀就是使图像中高亮部分扩张,效果图拥有比原图更大的高亮区域。
原理:自定义Kernel在原图每个像素进行卷积操作,计算Kernel覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。
相关API:
getStructuringElement(int shape,Size ksize,Point anchor)
shape:MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE
ksize:大于1
anchor:锚点,默认为中心POINT(-1,-1)
dilate(Mat src,Mat out,Mat element)
效果图:
代码:
int main(int argc, const char* argv[]){ // read image Mat img = imread("lena.png", IMREAD_COLOR); Mat out = Mat::zeros(img.rows, img.cols, img.type()); Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); dilate(img, out, element); imshow("source", img); imshow("dilate", out); waitKey(0); destroyAllWindows(); return 0; }
2.腐蚀
描述:腐蚀是原图中的高亮区域被蚕食,效果图拥有比原图更小的高亮区域
原理:自定义Kernel在原图每个像素进行卷积操作,计算Kernel覆盖的区域的像素点的最小值,并把这个最小值赋值给参考点指定的像素。
相关API:
errode(Mat src,Mat out,Mat element)
效果图:
代码:
int main(int argc, const char* argv[]){ // read image Mat img = imread("lena.png", IMREAD_COLOR); Mat out = Mat::zeros(img.rows, img.cols, img.type()); Mat element = getStructuringElement(MORPH_RECT, Size(5, 5)); erode(img, out, element); imshow("source", img); imshow("out", out); waitKey(0); destroyAllWindows(); return 0; }
3.开操作
描述:使图像的轮廓变得光滑, 使狭窄的连接断开和消除细毛刺,滤除噪声。
原理:先腐蚀后膨胀
相关API:
morphologyEx(img, out, CV_MOP_OPEN, element);(以下闭操作和顶帽黑帽都是用此API,改变参数即可)
效果图:
4.闭操作
描述:能够弥合狭窄的间断, 填充小的孔洞,填补轮廓线中的断裂、也会平滑轮廓的一部分。
原理:先膨胀再腐蚀。
效果图:
5.顶帽
描述:开运算放大了局部低亮度区域,因此,从原图中减去开运算后的图,得到的效果图 突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取。
原理:原图像与“开运算“的结果图之差
效果图:
6.黑帽
描述:黑帽运算的结果突出了比原图轮廓周围区域更暗的区域,所以黑帽运算用来分离比邻近点暗一些的斑块。
原理:原图像与“闭运算“的结果图之差
效果图:
形态学梯度
描述:描述图像亮度变化的剧烈程度;当我们想要突出高亮区域的外围时,则可以选用形态学梯度来突出边缘,可以保留物体的边缘轮廓。
原理:膨胀图与腐蚀图之差
效果图: