九、膨胀与腐蚀
1、形态学操作
- 图像形态学操作—基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
- 形态学有四个基本操作:腐蚀、膨胀、开、闭
- 膨胀与腐蚀是图像处理中最常用的形态学操作手段
2、形态学操作—膨胀(空白区域变大了,暗色部分变小了)
- 跟卷积操作类似,假设图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。(和前面提到的最大值滤波类似,不同的是这里的B可以为任意形状)
- 可以运用膨胀消除背景中的小的黑点
dilate(src, dst, kernel);//src为待处理图像,dst为处理后图像,kernel为获得的结构元素(后面会说到)将结构元素kernel覆盖下的所有像素的最大值赋给锚点
3、形态学操作—腐蚀(黑色区域变大了,空白区域变小了)
- 腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值
- 可以运用腐蚀消除背景中小的白点
erode(src, dst, kernel);//将结构元素kernel覆盖下的所有像素的最小值赋给锚点
4、相关的API
- 获取结构元素
getStructuringElement(int shape, Size ksize, Point anchor);
第一个参数:形状MORPH_RECT\ MORPH_CROSS\ MORPH_ELLIPSE
第二个参数:大小,只能为正的奇数
第三个参数:锚点默认是Point(-1,-1),意思是中心像素点
- 动态调整结构元素大小(界面操作:创造一个界面拖动条)
createTrackbar("Element Size :", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);
第一个参数:拖动条名称
第二个参数:窗口名称
第三个参数:元素开始的值
第四个参数:元素的最大值
第五个参数:一个callback功能函数
示例代码(膨胀腐蚀操作):
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat src, dst;
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*);
int main(int argc, char** argv) {
src = ("添加图片路径");
if (!src.data) {
cout << "could not load image..." << endl;
return -1;
}
imshow("input", src);
namedWindow("output", WINDOW_AUTOSIZE);
createTrackbar("Element Size :", "output", &element_size, max_size, CallBack_Demo);//在output窗口生成一个拖动条
CallBack_Demo(0, 0);
waitKey(0);
destroyAllWindows();
return 0;
}
void CallBack_Demo(int, void*) {
int s = 2 * element_size + 1; //只能为奇数
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s,s), Point(-1, -1));
dilate(src, dst, structureElement);//膨胀
erode(src, dst, structureElement);//腐蚀
return ;
}
最终输出结果如下:
膨胀:(左为原图;右为膨胀图,其上方带有拖动条)
腐蚀:(左为原图;右为腐蚀图,其上方带有拖动条)