仅自学做笔记用,后续有错误会更改
理论
- 图像形态学操作-基于形状的一系列图像处理操作的合集, 主要是基于集合论基础上的形态学数学
- 形态学有4个基本操作:膨胀丶腐蚀丶开丶闭
- 膨胀与腐蚀是图像处理中最常用的形态学操作手段
形态学操作(morphology operators)-膨胀
跟前边的卷积操作类似, 但是膨胀的操作是在核内所有像素值, 取最大的那个来替换中心锚点的值, 并且核的形状可以是矩形丶圆等.
如下图:
核(红黄部分)的形状是矩形, 膨胀的意思就是核覆盖的9个小格子里边, 读取里面的像素值, 并比较大小, 取最大值, 然后替换中心锚点(红色小格子)的像素值
形态学操作(morphology operators)-腐蚀
腐蚀的操作与膨胀相反, 是取核覆盖范围内最小像素值来替换锚点值.
相关API
膨胀: dilate(src, dst, kernel);
腐蚀: erode(src, dst, kernel);
上边的kernel的形状可以由getStructuringElement(int shape, Size ksize, Point anchor)接口创建.
-shape: 指定核的形状(MORPH_RECT\MORPH_CROSS\MORPH_ELLIPSE)
-ksize: 大小
-anchor: 锚点,缺省值是Point(-1,-1),也就是中心
形态学操作常配合TrackBar一起使用, 就是给你一个可拖动的滑块, 滑块变动可更改核的大小, 然后图像的膨胀/腐蚀程度会进行相应变化, 下边给个膨胀的例子, 最上边的滑块就是TrackBar
TrackBar的创建:createTrackbar(const String& trackbarName, const String winName, int* value, int count, Trackbarcallback func, void* userdata=0)
-trackbarName: 滑块控件的名称
-winName: 窗口名称,这个控件显示在哪个窗口上
-value: 滑块初始值
-count: 滑块最大可拖动值
-func: 膨胀/腐蚀操纵的回调函数
-userdata: 这个参数是用户传递给回调函数的数据,用来处理滑块拖动事件。如果使用的第三个参数value是全局变量,完全可以不去管这个userdata参数
代码示例
Mat src,dst;
char OUTPUT_WIN[] = "output image";
int element_size = 3;
int max_size = 30;
void CallBack_Demo(int, void*);
int main(){
src = imread(...);
namedWindow(OUTPUT_WIN, CV_WINDOW_AUTOSIZE);
createTrackbar("Element Size", OUTPUT_WIN, &element_size, max_size, CallBack_Demo);
CallBack_Demo(0,0);
waitKey(0);
return 0;
}
CallBack_Demo(int ,void* ){
int s = element_size*2 + 1;
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s,s), Point(-1,-1));
// 膨胀
// dilate(src, dst, stuctureElement, Point(-1,-1),1);
// 腐蚀
erode(src, dst, stuctureElement);
imshow(OUTPUT_WIN, dst);
}