用戶在使用Android手機拍攝過程中難免會出現文本圖像存在旋轉角度。這里采用霍夫變換、邊緣檢測等數字圖像處理算法檢測圖像的旋轉角度,並根據計算結果對輸入圖像進行旋轉矯正。
首先定義一個結構元素,再通過該結構元素對該圖像進行開運算和閉運算(即腐蝕膨脹運算)。
Imgproc.cvtColor(matOri, matGray, Imgproc.COLOR_RGB2GRAY); Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, new Size(20,20)); Imgproc.morphologyEx(matGray, matGray, Imgproc.MORPH_OPEN, kernel);
Imgproc.morphologyEx(matGray, matGray, Imgproc.MORPH_CLOSE, kernel);
然后調用Imgproc.threshold方法把原灰度圖轉換為二值圖。
Imgproc.threshold(matGray, matGray, 80, 255, Imgproc.THRESH_BINARY);
接着通過Canny邊緣檢測算子來檢測邊界。參數為edges輸出的邊緣圖像,threshold1和threshold2 當中的小閾值用來控制邊緣連接。
利用霍夫變換在二值圖中尋找直線,然后遍歷所有的直線調用Math.atan來計算直線的角度。過濾掉一些角度過於大的直線和非法角度得到該圖像該旋轉的角度,再旋轉該矩陣即可。
Mat edges = new Mat(); Imgproc.Canny(matGray, edges, 20, 160); Mat lines = new Mat();//檢測到的直線集合 Imgproc.HoughLinesP(edges, lines, 1, Math.PI/180, 45, 20, 20);
最后采用重投影技術矯正圖像旋轉:調用OpenCV函數Imgproc.getRotationMatrix2D()構建旋轉矩陣,調用函數Imgproc.warpAffine()構建旋轉后的圖像。
旋轉的角度如下圖:
采用重投影技術矯正圖像旋轉如圖: