日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python+Opencv建立一个文档扫描器

發布時間:2023/12/15 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python+Opencv建立一个文档扫描器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

    • 一、什么是文檔掃描器?
    • 二、實現文檔掃描器的步驟
    • 三、文檔掃描器的代碼實現
    • 四、文檔掃描器可視化
    • 五、文檔掃描器效果展示
    • 六、問題探討
    • 參考資料
    • 注意事項

一、什么是文檔掃描器?

??簡單來講,所謂的文檔掃描器的作用是對手機拍攝的圖片中的目標進行校正的過程,具體的效果如下圖所示:

左邊表示的是原始的輸入圖片,右邊表示校正后的結果,我們可以觀察到相比于校正前的圖片而言,糾正后的圖片變得更加規整,更加清晰。

二、實現文檔掃描器的步驟

為了實現這樣的一個文檔掃描器,我們只需要執行簡單的三個操作就可以啦。

1. 圖像邊緣檢測-獲取圖像中的目標的邊緣;
2. 使用邊緣信息獲得目標的輪廓(外點),即找到圖片中的目標;
3. 應用視角變換到圖像中去,即進行校正操作;

三、文檔掃描器的代碼實現

# coding=utf-8 # 導入一些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 # 設置一些需要改變的參數 ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required = True,help = "Path to the image to be scanned") args = vars(ap.parse_args())# 創建可視化文件夾 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() # 對輸入進行裁剪操作 image = imutils.resize(image, height = 500)# 圖像灰度化 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 進行高斯濾波處理 gray = cv2.GaussianBlur(gray, (5, 5), 0) # 進行邊緣檢測處理 edged = cv2.Canny(gray, 75, 200)# 顯示并保存結果 print("STEP 1: Edge Detection") cv2.imshow("Image", image) cv2.imshow("Edged", edged) cv2.imwrite("vis\edged.png", edged)# 在邊緣圖像中尋找輪廓,并過濾點較小的輪廓 cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # 按照區域的大小進行排序并獲取前5個結果 cnts = sorted(cnts, key = cv2.contourArea, reverse = True)[:5]# 遍歷整個輪廓集合 for c in cnts:# 使用多邊形近似輪廓peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.02 * peri, True)if len(approx) == 4:screenCnt = approxbreak# 顯示并保存結果 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)# 使用坐標點進行坐標變換 warped = four_point_transform(orig, screenCnt.reshape(4, 2) * ratio)# 將變換后的結果轉換為灰度值 warped = cv2.cvtColor(warped, cv2.COLOR_BGR2GRAY) # 獲取局部區域的閾值 T = threshold_local(warped, 11, offset = 10, method = "gaussian") # 進行二值化處理 warped = (warped > T).astype("uint8") * 255# 顯示并保存結果 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)

運行方法- python scan,py --image 圖片名稱

四、文檔掃描器可視化


??上圖是該算法的一些中間結果,該圖中的兩行分別展示了兩個事例, 第一列表示的是原始的輸入圖片,和代碼中的orig對應;第二列表示的是邊緣建測后的結果,和代碼中的edged對應;第3列表示的是輪廓的檢測結果,和代碼中的image對應;第4列表示應用變換后的結果,和代碼中的warped對應。

??代碼中有一段將變換后的圖片進行二值化處理,具體的效果如上圖所示,左邊表示變換之前的結果,整體是一個彩色圖,色調偏黃,而進行二值化處理之后的結果只有0和255兩種顏色,看起來視覺效果會更好一些。

五、文檔掃描器效果展示


??上圖是自己實際拍攝的兩張測試圖片的測試結果,整體來看整個算法比較魯棒,基本上能夠滿足我們的需求。

六、問題探討

??對于簡單的情況來講,該算法可以很好的處理,但是當遇到的背景比較復雜時,本算法基本上會失效的。

  • 問題1-當遇到的背景和目標之間有很大的干擾的時候,具體如下圖所示:

    ??如上圖所示,當背景的顏色和目標的差別不是很明顯時,該算法失效,主要的原因是出在邊緣檢測部分,不能很好的檢測出整個目標來,當然通過調節參數可以檢測到完整的邊緣,但是這并不是我們想要的自動化文檔掃描器。

  • 問題2-當圖片中含有多個目標的時候,具體如下圖所示:

    ??如上圖所示,當圖片中含有多個目標時,該算法會失效,主要的原因出現在輪廓檢測階段,聰明的你應該知道如何解決這個問題,不妨試試看,哈哈。

  • 問題N。。。其實本文這個算法還存在很多的小的問題需要根據工程的需要進行完善的,哈哈哈。

  • 參考資料

    1、參考博客

    注意事項

    [1] 該博客是本人原創博客,如果您對該博客感興趣,想要轉載該博客,請與我聯系(qq郵箱:1575262785@qq.com),我會在第一時間回復大家,謝謝大家的關注。
    [2] 由于個人能力有限,該博客可能存在很多的問題,希望大家能夠提出改進意見。
    [3] 如果您在閱讀本博客時遇到不理解的地方,希望您可以聯系我,我會及時的回復您,和您交流想法和意見,謝謝。
    [4] 本文測試的圖片可以通過該鏈接進行下載。測試圖片鏈接- 提取碼:n7np
    [5] 本人業余時間承接各種本科畢設設計和各種小項目,包括圖像處理(數據挖掘、機器學習、深度學習等)、matlab仿真、python算法及仿真等,有需要的請加QQ:1575262785詳聊!!!

    總結

    以上是生活随笔為你收集整理的Python+Opencv建立一个文档扫描器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。