1. 程式人生 > 其它 >Opencv學習(二)形態學操作

Opencv學習(二)形態學操作

(一)定義結構元素

可以通過形態學處理,使其變得豐滿,或者去除掉多餘的畫素。

結構元素可以簡單定義為:畫素的組合(如下圖)

(二)膨脹和腐蝕

在形態學中,通常使用二值影象作為輸入影象。在二值影象中,習慣用黑色(低畫素值)表示背景物體,白色(高畫素值)表示前景物體。

2.1 膨脹

是取核中(即上面的3x3矩陣中)畫素值的最大值代替錨點位置的畫素值,這樣會使影象中較亮的區域增大,較暗的區域減小。如果是一張黑底,白色前景的二值圖,就會使白色的前景物體顏色面積變大,就像膨脹了一樣。

Mat dialated;    //目標影象
dilate(image, dialated, Mat(),Point(-1
,-1),5); imshow("dialated", dialated);

2.2 腐蝕

腐蝕操作類似於中值平滑,也有一個核,但不進行卷積運算,而是取核中畫素值的最小值代替錨點位置的畫素值,這樣就會使影象中較暗的區域面積增大,較亮的的區域面積減小。如果是一張黑底,白色前景的二值圖,就會使白色的前景物體顏色變小,就像被腐蝕了一樣。

Mat eroded;//目標影象
Mat element(4, 4,CV_8U);//核大小
erode(image, eroded, Mat());

imshow("eroded", eroded);

2.3 開運算

先進行腐蝕操作,後進行膨脹操作,主要用來去除一些較亮的部分

,即先腐蝕掉不要的部分,再進行膨脹。

Mat opened;
morphologyEx(image, opened, MORPH_OPEN, Mat());

imshow("opened", opened);

2.4 閉運算

先進行膨脹操作,後進行腐蝕操作,主要用來去除一些較暗的部分

Mat closed;
morphologyEx(image, closed, MORPH_CLOSE, element, Point(-1, -1), 5);
imshow("closed", closed);

2.5 梯度運算

膨脹運算結果減去腐蝕運算結果,可以拿到輪廓資訊。

Mat result;
morphologyEx(image, result, MORPH_GRADIENT, Mat(),Point(
-1,-1),5); imshow("result", result);

2.6頂帽運算

原始影象減去開運算結果

即:原始帶刺的-不帶刺的=刺

Mat tophat;
morphologyEx(image,tophat, MORPH_TOPHAT, Mat());
imshow("tophat", tophat);

2.7黑帽運算

原始輸入-閉運算結果

Mat blackhat;
morphologyEx(image, blackhat, MORPH_BLACKHAT, Mat());
imshow("blackhat", blackhat);

  

(三)應用例項

提取出文字下劃線

void QuickDemo::pengzhanglianxi_demo(Mat& image)
{
    imshow("image", image);
    Mat img,img_thr,kernel,dst;
    cvtColor(image, img, COLOR_RGB2GRAY);
    threshold(img, img_thr, 127, 255, THRESH_BINARY);
    kernel = getStructuringElement(MORPH_RECT, Size(30, 1));
        //ksize – Size of the structuring element.
        //cols – Width of the structuring element
        //rows – Height of the structuring element

    dilate(img_thr, dst, kernel);
    imshow("img_thr", img_thr);
    imshow("dst", dst);
}