形态学腐蚀膨胀操作
Posted wangtianning1223
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了形态学腐蚀膨胀操作相关的知识,希望对你有一定的参考价值。
1.腐蚀操作
增强图像的暗部(图像矩阵中数值更小的部分),滤波得到的新像素点为滤波器内最小的值,也就是用最暗的点代替滤波器内的锚点
erode(src,dst,kernel,Point,epoch_num)
参数分别为:输入图像,输出图像,滤波器,锚点(一般为Point(-1,-1)),迭代次数(默认为一次)
2.膨胀操作
增强图像的亮部(图像矩阵中数值更大的部分),滤波得到的心像素点为滤波器内的最大值,也就是用最亮的点代替滤波器内的锚点
dilate(src,dst,kernel,Point,epoch_num)
参数同腐蚀
以上两个解释是我认为最好懂的定义
按照数字图像处理教材中的说法
二值图像的腐蚀是使用滤波器对图形进行滤波,滤波器的边界不超过图形边界,那么滤波后图形的新边界就是由锚点所画的边界,像队员图形会有所缩小所以叫腐蚀
膨胀是锚点不超过图性的边界,那么滤波器边界画出的新边界就是新的图形边界,相比原图行会有所扩大,所以是膨胀。
这种说法不是非常准确,我觉得按照像素点的数值来描述更准确一些。
获取滤波器
Mat kernel=getstructuringElement(int shape,Size kernel,Point)
shape为滤波器形状,常为:MORPH_RECT矩形,MORPH_CROSS十字,MORPH_ELLIPSE圆弧
代码
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Mat src, dst; int elem_size = 3; int max_size = 21; char output_win[] = "output image"; void callback_demo(int, void*); int main(int argc, char **argv) { src = imread("b.jpg"); if (src.empty()) { cout << "load img failed" << endl; return -1; } imshow("input img", src); namedWindow(output_win, CV_WINDOW_AUTOSIZE); createTrackbar("Element size :", output_win, &elem_size, max_size, callback_demo); callback_demo(0, 0); waitKey(0); return 0; } void callback_demo(int, void*) { int s = elem_size * 2 + 1; Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1)); //dilate(src, dst, structureElement, Point(-1, -1),1); erode(src, dst, structureElement, Point(-1, -1), 1); imshow(output_win, dst); return; }
增加了滚动条可以调节腐蚀膨胀的滤波器大小,随着滤波器变大可以清楚看到图片的亮度按照滤波器的形状逐层叠加。
暗部增强的腐蚀
亮部增强的膨胀
不同形状
以上是关于形态学腐蚀膨胀操作的主要内容,如果未能解决你的问题,请参考以下文章
详解图像形态学操作之图形的腐蚀和膨胀的概念和运算过程,并利用OpenCV的函数erode()和函数dilate()对图像进行腐蚀和膨胀操作