opencv---檢測試卷填空題的下劃線

問題描述:如何將試卷中填空題的下劃線檢測出來,便於後續的文字檢測處理。

如圖所示,直接對圖像進行霍夫曼直線檢測處理,那麼其中的非直線部分,會對檢測結果造成比較大的影響,無法準確檢測出圖像中直線的位置。如下圖所示,便是使用灰度變換+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)代碼中在形態學處理後,又加了一步圖像膨脹操作,這是爲了避免一條直線中間會出現斷點,使得直線變的不連續,而通過膨脹操作處理後,直線會被突出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章