膨脹,輸出的像素值是結構元素覆蓋下輸入圖像的最大像素值(灰度圖像下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);
最後的效果如下