OpenCV--提取水平與垂直線(形態學操作應用)
阿新 • • 發佈:2019-02-03
影象形態學操作的時候,可以通過自定義的結構元素實現結構元素對輸入影象一些物件敏感,另外一些物件不敏感,這樣就會讓敏感的物件改變而不敏感的物件保留輸出。通過使用兩個最基本的形態學操作–膨脹與腐蝕,使用不同的結構元素實現對輸入影象的操作,得到想要的結果。
操作過程:
- 讀取原圖;
- 轉為灰度影象;
- 轉為二值影象;
- 定義結構元素;
- 開操作。
例項程式碼:
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();
}
處理結果: