形态学运用(去除图像噪点,提取水平线,垂直线)--OPenCV08

膨胀,输出的像素值是结构元素覆盖下输入图像的最大像素值(灰度图像下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);

 

最后的效果如下 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章