膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值(灰度图像下255是白色)
腐蚀,输出的像素值是结构元素覆盖下输入图像的最小像素值(灰度图像下0是黑色)
现在有一张有噪点的图片,需要提取出图像的字母元素
要消除除字母外的杂质,很明显 需要先膨胀,取周围像素的最大值,即变为白色。
明显可以看出这个操作确实可以消除噪声,但是膨胀的过度导致我的元素也有些模糊不清,此时需要腐蚀来使得元素清晰起来,先膨胀后腐蚀的操作即是形态学中的闭操作,我们就可以使用MORPH_CLOSE进行操作
使用后发现,效果不太明朗,噪声依旧存在,于是打算多来几次,迭代的重复做几次,发现效果就出来了。
Img1 = imread("zzz.png");
if (!Img1.data)
{
cout << "未找到图片" << endl;
return -1;
}
cvtColor(Img1, Img1, COLOR_BGR2GRAY); //将图片转为灰度图像
imshow("Input Img", Img1);
Mat OutImg;
//结构元素 kenel
Mat kenel = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(Img1, OutImg, MORPH_CLOSE, kenel,Point(-1,-1),3);
//最末尾的参数3 即代表迭代次数是3 这个参数默认值是1 需要自行修改
imshow("Close Img", OutImg);
提取图像中的水平线,垂直线
想要提取水平线,垂直线,就需要思考一下结构元素。
膨胀取的是结构元素区域内的最大值,若要提取水平线,那我定义一个横条的结构元素,
进行膨胀操作,横条元素与图像中的非水平像素相重合时,自然会输出最大像素,则可以消除掉影响。
同理,提取垂直线就定义一个竖条的结构元素。
Mat VerticalImg,HorizonImg;
Mat Horizon_kenel = getStructuringElement(MORPH_RECT, Size(Img1.cols/16,1));
Mat Vertical_kenel = getStructuringElement(MORPH_RECT, Size(1, Img1.rows/16));
Size()函数前一个参数是宽度 后一个参数是高度 即前一个参数是列 后一个是行
morphologyEx(Img1, VerticalImg, MORPH_CLOSE, Vertical_kenel, Point(-1, -1), 1);
//直接使用MORPH_OPEN也可以出来效果
imshow("Vertical Img", VerticalImg);
morphologyEx(Img1, HorizonImg, MORPH_CLOSE, Horizon_kenel, Point(-1, -1), 1);
imshow("Horizon Img", HorizonImg);
最后的效果如下