1. 程式人生 > >OpenCV--提取水平與垂直線(形態學操作應用)

OpenCV--提取水平與垂直線(形態學操作應用)

      影象形態學操作的時候,可以通過自定義的結構元素實現結構元素對輸入影象一些物件敏感,另外一些物件不敏感,這樣就會讓敏感的物件改變而不敏感的物件保留輸出。通過使用兩個最基本的形態學操作–膨脹與腐蝕,使用不同的結構元素實現對輸入影象的操作,得到想要的結果。

操作過程:

  • 讀取原圖;
  • 轉為灰度影象;
  • 轉為二值影象;
  • 定義結構元素;
  • 開操作。

例項程式碼:

void GetLine(){
    Mat src,grayImg,binImg,dest;
    //①、讀取圖片
    src = imread("line.png");
    if(!src.data){
        cout <<
"圖片開啟失敗!" << endl; return; } namedWindow("原影象",CV_WINDOW_AUTOSIZE); imshow("原影象",src); //②、轉為灰度圖 cvtColor(src,grayImg,CV_RGB2GRAY); namedWindow("灰度圖",CV_WINDOW_AUTOSIZE); imshow("灰度圖",grayImg); //③、轉為二值影象 adaptiveThreshold(~grayImg,binImg,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY ,15
,-2); namedWindow("二值影象",CV_WINDOW_AUTOSIZE); imshow("二值影象",binImg); //④、定義結構元素 Mat kernel = getStructuringElement(MORPH_RECT,Size(1,20)); //⑤、開操作 morphologyEx(binImg,dest,MORPH_OPEN,kernel); namedWindow("最終結果",CV_WINDOW_AUTOSIZE); imshow("最終結果",~dest); cvWaitKey(); }

提取結果:
這裡寫圖片描述

去除橫線,提取字母:
這裡寫圖片描述

例項程式碼:

void GetChar(){
    Mat src,grayImg,binImg,dest;
    //①、讀取圖片
    src = imread("char.png");
    if(!src.data){
        cout << "圖片開啟失敗!" << endl;
        return;
    }
    namedWindow("原影象",CV_WINDOW_AUTOSIZE);
    imshow("原影象",src);
    //②、轉為灰度圖
    cvtColor(src,grayImg,CV_RGB2GRAY);
    namedWindow("灰度圖",CV_WINDOW_AUTOSIZE);
    imshow("灰度圖",grayImg);
    //③、轉為二值影象
    /*
    void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
    */
    adaptiveThreshold(~grayImg,binImg,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY ,15,-2);
    namedWindow("二值影象",CV_WINDOW_AUTOSIZE);
    imshow("二值影象",binImg);
    //④、定義結構元素
    Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
     //⑤、開操作
    morphologyEx(binImg,dest,MORPH_OPEN,kernel);
    namedWindow("最終結果",CV_WINDOW_AUTOSIZE);
    imshow("最終結果",~dest); 
    cvWaitKey();
}

處理結果:
這裡寫圖片描述