图形的形态学操作-基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学
形态学有四个基本操作:腐蚀、膨胀、开运算、闭运算
膨胀和腐蚀是图像处理中最常用的形态学操作手段
与卷积操作类似,假设有图像A和结构元素B,结构元素B在A上边移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任何形状。
腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下的像素值。
先腐蚀,再膨胀
假设图像前景色是白色,背景色是黑色。可以去掉图像上一些小的对象
先膨胀,再腐蚀
闭运算可以填充小洞,填充小的噪点
膨胀减腐蚀
dst=morphgrad(src,element)=dilate(src,element)-erode(src,element)
又称基本梯度(其他还包括内部梯度,方向梯度)
getStructuringElement(int shape,size ksize,point anchor) //用于生成卷积核
-shape(形状)(MORPH_REACT\MORPH_CROSS\MORPH_ELLIPSE)
-size(大小)
-point(锚点) 默认是point(-1,-1)意思就是中心像素
dilate(src,dst,kernel) 膨胀
erode(src,dst,kernel) 腐蚀
morphologyEx(src, dst, MORPH_BLACKHAT, kernel);
-Mat src -输入图像
-Mat dst-输出图像
-类型MORPH_OPEN(开运算),MORPH_CLOSE(闭运算),
MORPH_GRADIENT(形态学梯度), MORPH_TOPHAT(顶帽:原图像-开运算的结果),
MORPH_BLACKHAT(黑帽:闭运算图像-源图像的结果)
-Mat kernel 结构元素,结构元素的大小取决于噪点的大小
-int iteration迭代次数,默认是1
代码演示:
#include
#include
#include
using namespace cv;
using namespace std;
Mat src,dst;
char OUTPUT[] = "output image";
int element_size = 3;
int max_size = 21;
void CallBack_Demo(int, void*) {
int s = element_size * 2 + 1;
Mat kernel = getStructuringElement(MORPH_RECT, Size(s,s), Point(-1, -1));
dilate(src, dst, kernel, Point(-1, -1), 1); //膨胀
erode(src,dst,kernel); //腐蚀
imshow(OUTPUT, dst);
return;
}
int main(int argc, char** argv) {
src = imread("D:/image/img1.jpg");
if (!src.data) {
printf("could load imgage....\n");
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
namedWindow(OUTPUT,WINDOW_AUTOSIZE);
//createTrackbar("Element Size:", OUTPUT_WIN, &element_size, max_size, CallBack_Demo); //生成一个滑块
//先创建Trackbar,在这里边先调用CallBackDemo,会在CallBackDemo上生成一个滑块,然后再调用执行CallBackDemo
//CallBack_Demo(0, 0);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(src, dst, MORPH_OPEN, kernel);
imshow(OUTPUT, dst);
waitKey(0);
return 0;
}