摳字調(diào)研報告
1.需求分析
摳字的需求:把紙上的文字摳出來以透明背景的png的格式保存下來。這個png的圖片有兩個用處:1川无、保存到本地相冊蚜厉;2届良、作為水印添加到另一張圖片上,這個水印png可以拉伸亚脆、拖動改變位置
需求分解
- 把紙上的文字保存為黑白圖片
- 把該圖片背景色改為透明
2.實現(xiàn)文字轉(zhuǎn)墨跡圖片
對
iOS
平臺處理圖片文字相關庫OpenCV
和Tesseract
的了解OpenCV
有一個imgproc
模塊,是用來圖像處理相關,包括線性和非線性圖像濾波如输、幾何圖像轉(zhuǎn)換、顏色空間轉(zhuǎn)換央勒、直方圖等等不见。確認使用OpenCV
來處理該功能-
利用
opencv
對圖片進行處理,步驟大致如下1. 圖像彩色轉(zhuǎn)灰度 2. 灰度圖像設置閾值后二值化即變成完全黑白 3. 去除多余的噪點
3.1 將
UIImage
對象轉(zhuǎn)成轉(zhuǎn)成cv::Mat
3.2 把圖片放大
3.3 轉(zhuǎn)化成灰度圖CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
在opencv中崔步,其默認的顏色制式排列是BGR而非RGB稳吮。所以對于24位顏色圖像來說,前8-bit是藍色井濒,中間8-bit是綠色灶似,最后8-bit是紅色列林。 code=COLOR_BGR2GRAY
3.4 二值化轉(zhuǎn)為完全黑白
OpenCV
提供了兩個函數(shù),第一個是普通的Threshold
函數(shù):CV_EXPORTS_W double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
傳入圖像酪惭,傳出圖像希痴,閾值,填充的最深顏色撞蚕,填充方法(達到閾值就填充最深顏色或相反)润梯,就可以根據(jù)每個像素的灰度值與閾值進行比較來決定填充的值為0或是最深。
定閾值的方法雖然可以對一張圖像通過調(diào)整達到最優(yōu)的效果甥厦,但是對于不同光照條件下拍攝出來的照片纺铭,因為整體亮度的不同,定閾值顯然無法適應所有的情況刀疙。
所以就有了第二種函數(shù)舶赔,
adaptiveThreshold
,除了傳入上面的這些參數(shù)外谦秧,增加了三個重要的參數(shù)CV_EXPORTS_W void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C );
blockSize
:對某個像素周圍進行采樣的范圍竟纳。
adaptiveMethod
:根據(jù)上面的范圍求閾值的方法,有兩種:mean平均疚鲤,簡單地取采樣范圍內(nèi)的平均值作為閾值锥累。 gaussian高斯,以高斯函數(shù)為基礎集歇,簡單地說就是近的地方權重更高桶略、遠的地方權重低,來求閾值诲宇。
C
:求出來的閾值減去的常量际歼。3.5 去噪點
去噪的目的是把圖像中的獨立的點去掉。去噪的方法是腐蝕姑蓝,跟字面意思一樣鹅心,就是縮小圖案的范圍,當圖像的范圍本身就很小時(噪點就是一個個這樣的獨立點)纺荧,縮小后自然就不見了旭愧。
可以想到,在去噪后宙暇,部分筆畫也隨之縮小甚至細的地方會直接消失输枯,所以腐蝕之后要再進行一步膨脹,即把圖案的邊緣擴大客给。
因為噪點已經(jīng)消失,所以也不會因擴大而回來肢簿,但筆畫依然存在靶剑,就會膨脹而得到彌補蜻拨,也順便可以補一下殘缺的地方。
原理大概就是這樣桩引,但是由于
OpenCV
的這兩個操作針對的是圖像中的亮點(白色的地方被認為是亮點)缎讼,而我們的表格又是白底黑字的,實際上黑色的部分是我們想要處理的部分坑匠,所以我將這兩步交換了血崭,相當于是對黑色的地方先腐蝕后膨脹。代碼如下
//膨脹一次 cv::Mat dilateelement = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(8,8)); cv::Mat dilate1; dilate(binary, dilate1, dilateelement); //輕度腐蝕一次,去除噪點 cv::Mat element3 = cv::getStructuringElement(cv::MORPH_CROSS, cv::Size(8,8)); cv::Mat erode11; erode(dilate1, erode11, element3);
參考網(wǎng)站
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.html
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/erosion_dilatation/erosion_dilatation.html#morphology-1
https://www.viseator.com/2016/11/15/OpenCV%E5%A4%84%E7%90%86%E6%8B%8D%E7%85%A7%E8%A1%A8%E6%A0%BC%EF%BC%88%E4%B8%80%EF%BC%89/
3.把圖片修改為透明顏色
遍歷圖片的所有像素,把是白色或者接近白色的像素改成透明色。
將像素點轉(zhuǎn)成子節(jié)數(shù)組來表示---第一個表示透明度即`ARGB`這種表示方式楞黄。
4.總結(jié)
摳字功能主要用到了OpenCV
Core Image
谷市,我對這兩個庫都是基礎了解,很多功能都在網(wǎng)上查找的躬审。實現(xiàn)該功能最困難的地方就是在照片腐蝕膨脹那,參數(shù)配置做了大量的測試,有些圖片處理后噪點還是很多月匣,有些又處理過了,需要在這中間找到一些平衡奋姿。