形態學運用(去除圖像噪點,提取水平線,垂直線)--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);

 

最後的效果如下 

 

 

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