opencv有一些基本的形态学运算,对图像做初步处理,用来突出需要分割或进一步处理的图像;算子具体的原理就不做解释了,直接上代码看应用场景,代码里有注解:
void imgMorph()//图像形态学操作
{
Mat srcImg = imread("D:/ImageTest/Rice.png");
Mat dstImg1,dstImg2,dstImg3,dstImg4,dstImg5,dstImg6,dstImg7;
imshow("src", srcImg);
cv::cvtColor(srcImg,srcImg,COLOR_RGB2GRAY);//进行,灰度处理
threshold(srcImg,srcImg, 127, 255, THRESH_BINARY);
Mat element = getStructuringElement( //定义kernel(获取结构元素)
MORPH_RECT,//MORPH_RECT,矩形;MORPH_CROSS,交叉形;MORPH_ELLIPSE,椭圆形
Size(3, 3)//内核尺寸
);
erode(srcImg, dstImg1, element, Point(-1, -1), 1);//腐蚀,将高亮部分腐蚀
dilate(srcImg,dstImg2,element,Point(-1, -1),1); //膨胀,将高亮部分膨胀
morphologyEx(srcImg, dstImg3, MORPH_OPEN, element); //开运算,先腐蚀在膨胀,消除小亮点,分离
morphologyEx(srcImg, dstImg4, MORPH_CLOSE, element); //闭运算,先膨胀再腐蚀,消除小黑点
morphologyEx(srcImg, dstImg5, MORPH_GRADIENT, element); //形态学梯度运算,膨胀图与腐蚀图之差,凸显团块边缘
morphologyEx(srcImg, dstImg6, MORPH_TOPHAT, element); //顶帽运算,闭运算与源图像之差,分离临近亮块
morphologyEx(srcImg, dstImg7, MORPH_BLACKHAT, element); //黒帽运算,开运算与源图像之差,分离临近暗块
imshow("erode dst1", dstImg1);
imshow("dilate dst2", dstImg2);
imshow("OPEN dst3", dstImg3);
imshow("CLOSE dst4", dstImg4);
imshow("GRADIENT dst5", dstImg5);
imshow("TOPHAT dst6", dstImg6);
imshow("BLACKHAT dst7", dstImg7);
waitKey(0);
}
效果: