国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        如何使用Python創建自己的文檔掃描儀

        2021-08-16 10:15
        磐創AI
        關注

        介紹

        對這個項目的動機很簡單。我們中的許多人轉向了在線工作。隨著在線工作量的增加,人們通常不得不通過電子郵件或其他方式呈現文檔的數字化版本。換句話說,將任何文檔轉換為掃描文檔。本文,將介紹如何使用 Python 從頭開始創建文檔掃描儀。準確地說,是用于圖像/視頻處理的 OpenCV 庫。事不宜遲,讓我們開始吧。文件掃描儀在進入編碼部分之前,我們需要了解我們將要做什么。這是在開始這個項目之前問自己的一系列問題。我們想在這里建造什么?

        — 文件掃描儀。好的。但它做什么或應該做什么?— 顯然,要掃描文檔。正確的。那么,掃描出來的文件應該是什么樣子的呢?— 好問題,對吧?具體來看,掃描的文檔應該有兩個特點:看起來像掃描的文檔,黑白 (B&W) 顏色;正確旋轉(無隨機角度)。讓我們先從簡單的功能開始,并根據需要增加其他功能。編碼文件掃描儀首先讓我們導入這個項目需要的所有庫(我們可能會根據需要添加一些東西)import numpy as np
        import cv2
        from skimage.filters import threshold_local
        import math
        from scipy import ndimage
        print("Imports are Done!")
        I. 第一個屬性:掃描(黑白)視圖讓我們從掃描儀的第一個屬性開始——生成掃描圖像!在這個例子中,我使用了一張照片,來自Yuval Noah Harari的書*“21 Lessons for the 21st Century*。

        旁注:它是一本很棒的書。本系列的其他兩本書(“Sapiens: A Brief History of Humankind”和“Homo Deus: A Brief History of Tomorrow”)都建議閱讀!回到我們的文檔掃描儀,我們希望通過更改配色方案使該圖像看起來清晰明快。讓我們將此操作稱為  Scan_view()。為了使它成為一個完整的應用程序項目,讓我們創建一個名為Scanner的類,其中Scan_view() 將是其方法。class Scanner:
        def __init__(self, img):
         self.img = img

        def Scan_View(self):
         print("Scanned View")
         # read the original image, copy it,
         # apply threshold to "scannify" it
         image = cv2.imread(self.img)
         orig = image.copy()
         
         # convert our image to grayscale, apply threshold
         # to create scanned view effect
         image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
         thr = threshold_local(image, 11, offset = 10, method = "gaussian")
         image = (image > thr).astype("uint8") * 255
         # show the original image and the edge detected image
         #cv2.imshow("orig", orig)
         #cv2.imshow("Scanned", image)
         #cv2.waitKey(0)
         #cv2.destroyAllWindows()
         print(np.shape(orig), np.shape(image))
           
         # Saving a B&W image itself
         cv2.imwrite('Part_scan_view.png', image)
         return image
        代碼的快速解釋:創建一個scan具有圖像作為其屬性的對象。因此,self.img = img在__init__()方法中使用;另外,想要一種負責更改此屬性(即圖像/文檔)的方法——更改配色方案、旋轉、裁剪、調整大小等。因此Scan_View()對它的類屬性(即,對它自己或self)執行操作。這個方法的實質隱藏在threshold_local操作中。這基本上是一種基于像素的局部鄰域計算閾值掩碼的操作。這也稱為自適應閾值。閾值是像素的局部鄰域的加權平均值減去常數。找到閾值掩碼后,我們只需將前景像素值選擇為image>threshold。我們可以保存新的清晰新鮮的圖像并返回以備進一步處理。要運行代碼,我們可以簡單地創建一個scan對象并為其提供文檔/照片作為其屬性,如下所示:
        if __name__=="__main__":
        # Defining the image name
        img = "21_Lesson_21th_Century.jpeg"

        # Calling the scanner class
        scan = Scanner(img)

        # Scanning the image -> B&W scheme
        scanned_im = scan.Scan_View()
        結果,我們得到了這張圖片:

        上述文件的掃描版本。讓我們繼續進行項目的下一部分。II. 第二個屬性:文檔輪換讓我們繼續我們的掃描儀的第二個屬性——文檔旋轉!假設,我們以隨機角度拍攝了一本書的照片。自動旋轉它以獲得自上而下的正面視圖不是很好嗎?當然會!問題是怎么做?最初,我們正在考慮使用主成分分析 (PCA) 來確定文檔方向。然而,對于這個項目來說,這似乎有點過分了。我們想要一些簡單但有效的東西。會自動確定文本/邊框線和水平線之間的旋轉角度的東西。因此,想出了一個更簡單的方法,它基本上利用了霍夫變換。簡而言之,霍夫變換是一種用于檢測各種形狀的技術。在我們的例子中,這將是一組沿著文本行的行!好主意,對吧?但是為了使這種方法健壯,我們需要確保檢測到正確的方向。一些線條可能沿著文本出現,但其他線條沿著書籍/文檔邊緣出現——我們不希望那樣。所以,我們想要平均這些變化。換句話說,要找到所有線角的中值。因此,我們將掃描對象(Rotation())的新方法定義如下:class Scanner:
        def __init__(self, img):
         self.img = img
        def Rotation(self):
         print("Rotation")
         # read the original image, copy it,
         # rotate it
         image = cv2.imread(self.img)
         orig = image.copy()
         
         image = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
         img_edges = cv2.Canny(image, 100, 100, apertureSize=3)
         lines = cv2.HoughLinesP(img_edges, rho=1, theta=np.pi / 180.0, threshold=160, minLineLength=100, maxLineGap=10)
         
         # calculate all the angles:
         angles = []
         for [[x1, y1, x2, y2]] in lines:
          angle = math.degrees(math.atan2(y2 - y1, x2 - x1))
          angles.append(angle)
         
         # average angles
         median_angle = np.median(angles)
         # actual rotation
         image = ndimage.rotate(image, median_angle)
         # Saving an image itself
         cv2.imwrite('Part_rotation.png', image)
         return image
        如上所述,這部分應用程序的重點是找到正確的霍夫線(HoughLinesP()方法,其中P代表概率,請參閱參考資料以了解有關此方法的更多信息)我們從每條線獲得角度的中值并將其用于文檔旋轉(ndimage.rotate()方法)。我們可以對清晰的黑白圖像執行此操作,如下所示:if __name__=="__main__":
        # Defining the image name
        img = "Part_scan_view.png"
         
          # Calling the scanner class
        scan = Scanner(img)
         
          # Performing Rotation
        rotated_im = scan.Rotation()
        結果,我們得到了一個旋轉的圖像:

        精彩的掃描、清晰和旋轉的圖像!完整代碼對于感興趣的讀者,這里是一個GitHub 存儲庫,其中包含每種方法的更多詳細信息和文檔。h概括在本文中,我們學習了如何使用著名的用于圖像/視頻處理的 Python 庫 OpenCV 從頭開始構建文檔掃描儀的工作原型。未來發展將這個應用程序稱為文檔掃描儀 (v.1), 因為有一些可以進一步改進它的地方。1.例如,使用另一種(或改進的)算法進行文檔輪換。由于其性質,該算法可能并不總是在 100% 的情況下提供完美的俯視圖。一種替代方法可能是使用主成分分析(或 PCA)來確定文檔的更精確方向。但這超出了本文的范圍。2.關于旋轉本身,我不喜歡旋轉圖像上的那些空黑塊。這也可以解決以改進此應用程序。可能是使它們為空 ( NaN) 值。3.另一個可能需要仔細檢查的操作是黑白顏色轉換。我認為自適應閾值是一個不錯的選擇,但是,可能有更好的方法。


        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 超碰666| 性交大片| 亚洲男人天堂| 国产av日韩av| 亚洲天堂中文字幕| 人人肏| 伊人久久大香线蕉av一区| 明星| jizz亚洲人| 青草伊人网| 超碰666| 国产熟女在线播放第一页| 黄色综合| 99久久精品国产毛片| 通州区| 熟女在线播放| 伊宁县| 日本黄色免费| 色婷av| 伊人久久精品| AV无码一区二区三区| 久热官网| 成人AV一区二区三区| 无套内谢少妇毛片A片樱花| www.99| 91中文视频| 亚洲网在线| 望奎县| 好吊妞这里有精品| 天海翼一区| 兴化市| 欧美成人午夜无码A片秀色直播 | 92自拍视频| 波多野结衣AV不卡无码| 人妻丝袜| 国产黄在线观看| 熟女精品| 三级片久久| 黄浦区| 永久黄片| AV色播|