圖像開運算、閉運算、形態學梯度、“禮帽”和“黑帽”

一、概念
圖像的腐蝕和膨脹可以做更多的事情,可以通過膨脹和腐蝕來做一些圖像的高級形態學變化,圖像的高級形態學變化 有圖像的開運算、閉運算、形態學梯度、頂帽,黑帽。

二、圖像高級形態學變化
1、開運算:先腐蝕後膨脹

開運算可以用來消除小物體,在纖細點分離物體,平滑較大物體的邊界的同時不明顯的改變其面積。

2、閉運算:先膨脹後腐蝕

閉運算可以排除小的黑色區域。

3、形態學梯度:膨脹與腐蝕圖之差

我們可以用形態學梯度來突出邊緣,可以保留物體的邊緣輪廓。

4、頂帽(Top Hat):原圖與開運算結果圖之差

開運算放大了裂縫或者局部低亮度的區域,所以,從原圖中減去開運算後的圖,得到的結果突出了比原圖輪廓周圍的區域更明亮的區域,這個操作與選擇的核的大小有關。TopHat運算一般用來分離比鄰近點亮一些的斑塊,可以使用這個運算提取背景。

5、黑帽運算(Black Hat):閉運算的結果與原圖之差

黑帽運算的結果突出了比原圖輪廓周圍區域更暗的區域,所以黑帽運算用來分離比鄰近點暗一些的斑塊。

三、實戰

1、morphology函數

 void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );

第一個參數,InputArray類型的src,輸入圖像,即源圖像,填Mat類的對象即可。圖像位深應該爲以下五種之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
第二個參數,OutputArray類型的dst,即目標圖像,函數的輸出參數,需要和源圖片有一樣的尺寸和類型。
第三個參數,int類型的op,表示形態學運算的類型,可以是如下之一的標識符:
oMORPH_OPEN – 開運算(Opening operation)
oMORPH_CLOSE – 閉運算(Closing operation)
oMORPH_GRADIENT -形態學梯度(Morphological gradient)
oMORPH_TOPHAT - “頂帽”(“Top hat”)
oMORPH_BLACKHAT - “黑帽”(“Black hat“)
另有CV版本的標識符也可選擇,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,這應該是OpenCV1.0系列版本遺留下來的標識符,和上面的“MORPH_OPEN”一樣的效果。
 
第四個參數,InputArray類型的kernel,形態學運算的內核。若爲NULL時,表示的是使用參考點位於中心3x3的核。我們一般使用函數 getStructuringElement配合這個參數的使用。getStructuringElement函數會返回指定形狀和尺寸的結構元素(內核矩陣)。關於getStructuringElement我們上篇文章中講過了,這裏爲了大家參閱方便,再寫一遍:
其中,getStructuringElement函數的第一個參數表示內核的形狀,我們可以選擇如下三種形狀之一:
o矩形: MORPH_RECT
o交叉形: MORPH_CROSS
o橢圓形: MORPH_ELLIPSE

2、函數運用示例

void usage_high_level_erode_dilate(char* which)
{
    Mat   image = imread("./smimage/1.jpg");
    Mat   ele = getStructuringElement(MORPH_RECT, Size(5, 5));
    Mat   res;
    //which
    //open close gradient tophat blackhat
    //o c g t b
    switch (which[0]){
    case 'o':
        morphologyEx(image, res, MORPH_OPEN, ele);
        break;
    case 'c':
        morphologyEx(image, res, MORPH_CLOSE, ele);
        break;
    case 'g':
        morphologyEx(image, res, MORPH_GRADIENT, ele);
        break;
    case 't':
        morphologyEx(image, res, MORPH_TOPHAT, ele);
        break;
    case 'b':
        morphologyEx(image, res, MORPH_BLACKHAT, ele);
        break;
    }
    //show the image
    imshow("SRC", image);
    imshow(which, res);
    waitKey(0);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章