腐蚀可以理解为B的中心(锚点)沿着A的内边界走了一圈。腐蚀也是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里里面被外面取代。
膨胀可以理解为B的中心(锚点)沿着A的外边界走了一圈。膨胀是对高亮部分而言,A区域之外的部分 < A的高亮像素,所里外面被里面取代。
通过先进行腐蚀
操作,再进行膨胀
操作得到。我们在移除小的对象时候很有用(假设物品是亮色,前景色是黑色),被用来抹除比背景亮的噪点。
闭运算
是开运算的一个相反的操作,具体是先进行膨胀
然后进行腐蚀
操作,常用来抹除比背景暗的噪点。
用膨胀后的图像减去腐蚀的图像,可以用来提取图片中的边缘。
原图像与开操作后图像之差,取出高亮的小目标前景。
原图像与比操作后图像之差,取出非高亮的小目标前景。
//获取,卷积核
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//指定 卷积核形状 大小 锚点位置(-1为中心)
dilate(src, dst, structureElement, Point(-1, -1), 1);
// 源图 结果 卷积核 锚点 迭代次数
erode(src, dst, structureElement);
//默认 锚点为中心点 迭代次数为 1
//同样先获得,卷积核:
// MORPH_RECT 矩形 MORPH_CROSS 十字形 MORPH_ELLIPSE 椭圆形
Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//调用morphologyEx
morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
// 原图,结果,运算类型 运算核
/*******************************************************************************
MORPH_CLOSE 闭
MORPH_OPEN 开
MORPH_GRADIENT 梯度
MORPH_TOPHAT 顶帽
MORPH_BLACKHAT 黑帽
MORPH_DILATE 膨胀
MORPH_ERODE 腐蚀
*********************************************************************************/
#include
#include
#include
using namespace cv;
using namespace std;
Mat src,dst;
int element_size = 3;
int max_size = 25;
char OUTPUT[] = "OUTPUT_WINDOS";
void CallBack_Demo(int, void*)
{
int s = element_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);
//闭
//morphologyEx(src,dst,MORPH_CLOSE,structureElement);
//开
//morphologyEx(src, dst, MORPH_OPEN, structureElement);
//梯度
//morphologyEx(src, dst, MORPH_GRADIENT, structureElement);
//顶帽
//morphologyEx(src, dst,MORPH_TOPHAT , structureElement);
//黑帽
morphologyEx(src, dst, MORPH_BLACKHAT, structureElement);
imshow(OUTPUT, dst);
return;
}
int main(int argc, char* argv[])
{
//src = imread("src.jpg");
src = imread("1.PNG");
if (!src.data)
{
cout << "cannot open image" << endl;
return -1;
}
namedWindow("input image", WINDOW_AUTOSIZE);
imshow("input image",src);
namedWindow(OUTPUT,WINDOW_AUTOSIZE);
createTrackbar("Element Size:", OUTPUT, &element_size, max_size, CallBack_Demo);
CallBack_Demo(0, 0);
waitKey(0);
return 0;
}