Python+Opencv建立一个文档扫描器
目錄
- 一、什么是文檔掃描器?
- 二、實(shí)現(xiàn)文檔掃描器的步驟
- 三、文檔掃描器的代碼實(shí)現(xiàn)
- 四、文檔掃描器可視化
- 五、文檔掃描器效果展示
- 六、問(wèn)題探討
- 參考資料
- 注意事項(xiàng)
一、什么是文檔掃描器?
??簡(jiǎn)單來(lái)講,所謂的文檔掃描器的作用是對(duì)手機(jī)拍攝的圖片中的目標(biāo)進(jìn)行校正的過(guò)程,具體的效果如下圖所示:
左邊表示的是原始的輸入圖片,右邊表示校正后的結(jié)果,我們可以觀察到相比于校正前的圖片而言,糾正后的圖片變得更加規(guī)整,更加清晰。
二、實(shí)現(xiàn)文檔掃描器的步驟
為了實(shí)現(xiàn)這樣的一個(gè)文檔掃描器,我們只需要執(zhí)行簡(jiǎn)單的三個(gè)操作就可以啦。
1. 圖像邊緣檢測(cè)-獲取圖像中的目標(biāo)的邊緣;
2. 使用邊緣信息獲得目標(biāo)的輪廓(外點(diǎn)),即找到圖片中的目標(biāo);
3. 應(yīng)用視角變換到圖像中去,即進(jìn)行校正操作;
三、文檔掃描器的代碼實(shí)現(xiàn)
# coding=utf-8 # 導(dǎo)入一些python包 from imutils.perspective import four_point_transform # from pyimagesearch.transform import four_point_transform from skimage.filters import threshold_local import numpy as np import argparse import cv2 import imutils import os # 設(shè)置一些需要改變的參數(shù) ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True,help = "Path to the image to be scanned") args = vars(ap.parse_args())# 創(chuàng)建可視化文件夾 file_dir = "vis/" if not os.path.isdir(file_dir):os.makedirs(file_dir)# 讀取圖片 image = cv2.imread(args["image"]) ratio = image.shape[0] / 500.0 orig = image.copy() # 對(duì)輸入進(jìn)行裁剪操作 image = imutils.resize(image, height = 500)# 圖像灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 進(jìn)行高斯濾波處理 gray = cv2.GaussianBlur(gray, (5, 5), 0) # 進(jìn)行邊緣檢測(cè)處理 edged = cv2.Canny(gray, 75, 200)# 顯示并保存結(jié)果 print("STEP 1: Edge Detection") cv2.imshow("Image", image) cv2.imshow("Edged", edged) cv2.imwrite("vis\edged.png", edged)# 在邊緣圖像中尋找輪廓,并過(guò)濾點(diǎn)較小的輪廓 cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # 按照區(qū)域的大小進(jìn)行排序并獲取前5個(gè)結(jié)果 cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]# 遍歷整個(gè)輪廓集合 for c in cnts:# 使用多邊形近似輪廓peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.02 * peri, True)if len(approx) == 4:screenCnt = approxbreak# 顯示并保存結(jié)果 print("STEP 2: Find contours of paper") cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 2) cv2.imshow("Outline", image) cv2.imwrite("vis\contours.png", image)# 使用坐標(biāo)點(diǎn)進(jìn)行坐標(biāo)變換 warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)# 將變換后的結(jié)果轉(zhuǎn)換為灰度值 warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) # 獲取局部區(qū)域的閾值 T = threshold_local(warped, 11, offset = 10, method = "gaussian") # 進(jìn)行二值化處理 warped = (warped > T).astype("uint8") * 255# 顯示并保存結(jié)果 print("STEP 3: Apply perspective transform") cv2.imshow("Original", imutils.resize(orig, height = 650)) cv2.imshow("Scanned", imutils.resize(warped, height = 650)) cv2.imwrite("vis\orig.png", orig) cv2.imwrite("vis\warped.png", warped) cv2.waitKey(0)運(yùn)行方法- python scan,py --image 圖片名稱
四、文檔掃描器可視化
??上圖是該算法的一些中間結(jié)果,該圖中的兩行分別展示了兩個(gè)事例, 第一列表示的是原始的輸入圖片,和代碼中的orig對(duì)應(yīng);第二列表示的是邊緣建測(cè)后的結(jié)果,和代碼中的edged對(duì)應(yīng);第3列表示的是輪廓的檢測(cè)結(jié)果,和代碼中的image對(duì)應(yīng);第4列表示應(yīng)用變換后的結(jié)果,和代碼中的warped對(duì)應(yīng)。
??代碼中有一段將變換后的圖片進(jìn)行二值化處理,具體的效果如上圖所示,左邊表示變換之前的結(jié)果,整體是一個(gè)彩色圖,色調(diào)偏黃,而進(jìn)行二值化處理之后的結(jié)果只有0和255兩種顏色,看起來(lái)視覺(jué)效果會(huì)更好一些。
五、文檔掃描器效果展示
??上圖是自己實(shí)際拍攝的兩張測(cè)試圖片的測(cè)試結(jié)果,整體來(lái)看整個(gè)算法比較魯棒,基本上能夠滿足我們的需求。
六、問(wèn)題探討
??對(duì)于簡(jiǎn)單的情況來(lái)講,該算法可以很好的處理,但是當(dāng)遇到的背景比較復(fù)雜時(shí),本算法基本上會(huì)失效的。
問(wèn)題1-當(dāng)遇到的背景和目標(biāo)之間有很大的干擾的時(shí)候,具體如下圖所示:
??如上圖所示,當(dāng)背景的顏色和目標(biāo)的差別不是很明顯時(shí),該算法失效,主要的原因是出在邊緣檢測(cè)部分,不能很好的檢測(cè)出整個(gè)目標(biāo)來(lái),當(dāng)然通過(guò)調(diào)節(jié)參數(shù)可以檢測(cè)到完整的邊緣,但是這并不是我們想要的自動(dòng)化文檔掃描器。
問(wèn)題2-當(dāng)圖片中含有多個(gè)目標(biāo)的時(shí)候,具體如下圖所示:
??如上圖所示,當(dāng)圖片中含有多個(gè)目標(biāo)時(shí),該算法會(huì)失效,主要的原因出現(xiàn)在輪廓檢測(cè)階段,聰明的你應(yīng)該知道如何解決這個(gè)問(wèn)題,不妨試試看,哈哈。
問(wèn)題N。。。其實(shí)本文這個(gè)算法還存在很多的小的問(wèn)題需要根據(jù)工程的需要進(jìn)行完善的,哈哈哈。
參考資料
1、參考博客
注意事項(xiàng)
[1] 該博客是本人原創(chuàng)博客,如果您對(duì)該博客感興趣,想要轉(zhuǎn)載該博客,請(qǐng)與我聯(lián)系(qq郵箱:1575262785@qq.com),我會(huì)在第一時(shí)間回復(fù)大家,謝謝大家的關(guān)注。
[2] 由于個(gè)人能力有限,該博客可能存在很多的問(wèn)題,希望大家能夠提出改進(jìn)意見(jiàn)。
[3] 如果您在閱讀本博客時(shí)遇到不理解的地方,希望您可以聯(lián)系我,我會(huì)及時(shí)的回復(fù)您,和您交流想法和意見(jiàn),謝謝。
[4] 本文測(cè)試的圖片可以通過(guò)該鏈接進(jìn)行下載。測(cè)試圖片鏈接- 提取碼:n7np
[5] 本人業(yè)余時(shí)間承接各種本科畢設(shè)設(shè)計(jì)和各種小項(xiàng)目,包括圖像處理(數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等)、matlab仿真、python算法及仿真等,有需要的請(qǐng)加QQ:1575262785詳聊!!!
總結(jié)
以上是生活随笔為你收集整理的Python+Opencv建立一个文档扫描器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 联想小新 Pro 16 降至 5199
- 下一篇: 章鱼搜索怎么下载种子