數學形態學是數學形態學圖像處理的基本理論。其基本的運算包括:二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕
擊中擊不中變換、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹 灰值開閉運算、灰值形態學梯度
最基本的形態學操作爲 膨脹(dilate)和腐蝕(erode)
膨脹就是求局部最大值的操作,會使圖像中的高亮區域逐漸增長(變得更白)
腐蝕就是求局部最小值的操作,圖像的高亮區域會逐漸減少
一般使用getStructingElement這個函數 配合相關API使用
getStructingElement函數會返回指定形狀和尺寸的結構元素(內核矩陣)
第一個參數表示內核的形狀
矩形:MORPH_RECT
交叉形:MORPH_CROSS
橢圓形:MORPH_ELLIPSE
第二個第三個參數分別是內核的尺寸和錨點的位置
一般在調用dilate或者erode函數之前先定義一個Mat類型的對象
來獲取getStructingElement的返回值
對於錨點的位置,默認值point(-1,-1)即爲中心點
Mat element;
element = getStructuringElement(MORPH_RECT, Size(3, 3));
dilate(Img1, Img2, element); //膨脹
imshow("dilate img", Img2);
erode(Img1, OutImg, element); //腐蝕
imshow("erode img", OutImg);
接下來介紹的函數是morphologyEx函數
他利用基本的膨脹和腐蝕技術,來執行更加高級的形態學變換
morphologyEx
第三個參數int類型的op表示形態學運算的類型
MORPH_OPEN --開運算
MORPH_CLOSE --閉運算
MORPH_GRADIENT --形態學梯度
MORPH_TOPHAT --頂帽
MORPH_BLACKHAT --黑帽
MORPH_ERODE --腐蝕
MORPH_DILATE --膨脹
第四個參數 kernel 內核
同樣藉助於getStructingElement
第五個參數是錨點的位置 point(-1,-1)表示正中
第六個參數表示函數迭代的次數 可能一次效果並不明顯
開運算
其實就是先腐蝕後膨脹的過程(先變黑在變白)
開運算可以消除小的物體,在纖細處分離物體,
並且在平滑 較大物體的邊界的同時不明顯改變其面積
就是圖像中有一些坑坑窪窪白色區塊,可以有效去除掉。
Mat OpenImg;
morphologyEx(Img1, OpenImg, MORPH_OPEN, element);
imshow("Open img", OpenImg);
閉運算
其實就是先膨脹後腐蝕的過程(先變白後變黑)
閉運算可以排除小型黑洞(黑色區域)
Mat CloseImg;
morphologyEx(Img1, CloseImg, MORPH_CLOSE, element);
imshow("Close Img", CloseImg);
形態學梯度
形態學梯度是膨脹圖與腐蝕圖之差
對二值圖像進行這一操作的時候可以將團塊(blob)的邊緣突出出來。
我們可以利用形態學梯度保留物體的邊緣
Mat GradientImg;
morphologyEx(Img1, GradientImg, MORPH_GRADIENT, element);
imshow("Gradient Img", GradientImg);
頂帽
是 原圖像與開運算操作的圖像 之差
因爲開運算帶來的結果是放大了裂縫或者局部低亮度的區域。
從原圖減去開運算後的圖,得到的效果圖突出了比原圖輪廓周圍的區域更明亮的區域
且這一操作與選擇的核的大小相關
頂帽運算往往用來分離比鄰近點亮一些的斑點。
在一幅圖像具有大幅的背景,而微小物品比較有規律的情況下,可以使用頂帽進行背景提取
Mat Tophatimg;
morphologyEx(Img1, Tophatimg, MORPH_TOPHAT, element);
imshow("Tophat Img", Tophatimg);
黑帽
是 原圖像與閉運算操作的圖像 之差
黑帽運算後的效果圖突出了比原圖輪廓周圍區域更暗的區域
且這一操作與選擇的核的大小相關
黑帽運算用來分離比鄰近點暗一些的斑塊,效果圖有着非常完美的輪廓。
Mat BlackHatImg;
morphologyEx(Img1, BlackHatImg, MORPH_BLACKHAT, element);
imshow("Blackhat Img", BlackHatImg);