問題描述:如何將試卷中填空題的下劃線檢測出來,便於後續的文字檢測處理。
如圖所示,直接對圖像進行霍夫曼直線檢測處理,那麼其中的非直線部分,會對檢測結果造成比較大的影響,無法準確檢測出圖像中直線的位置。如下圖所示,便是使用灰度變換+canny邊緣濾波+Hough直線檢測處理的結果,可以發現會將一部分文字當作直線給誤檢處理。
本文的思路則是,在使用Hough直線檢測前加一步形態學圖像處理操作,降低文字對直線檢測的干擾。我們知道形態學開操作可以有效避免二值圖像中小的干擾塊,降低二值圖像中噪點過多的問題。
看一下處理結果
代碼如下
void dectLines(Mat src, Mat dst)
{
//灰度化
Mat gray, binary,openImg;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
//二值化
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
imshow("binary", binary);
//形態學處理
Mat kern = getStructuringElement(MORPH_RECT, Size(20, 1));
morphologyEx(binary, openImg, MORPH_OPEN, kern);
imshow("open", openImg);
//膨脹操作,加強直線
Mat kern2 = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(openImg, openImg, MORPH_DILATE, kern2);
imshow("膨脹", openImg);
//直線檢測
vector<Vec4i>lines;
dst = src.clone();
HoughLinesP(openImg, lines, 1, 3.1415 / 180, 20, 20, 0);
for (size_t i = 0; i < lines.size(); i++)
{
line(dst, Point(lines[i][0], lines[i][1]), Point(lines[i][2], lines[i][3]), Scalar(0, 0, 255), 2, 8);
}
imwrite("result.jpg", dst);
}
解釋:
(1)代碼中將canny操作變爲二值化處理,因爲canny操作產生的邊緣有時會對結果產生一定的影響。
(2)代碼中在形態學處理後,又加了一步圖像膨脹操作,這是爲了避免一條直線中間會出現斷點,使得直線變的不連續,而通過膨脹操作處理後,直線會被突出。