Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membina pengimbas dokumen dalam Python?

Bagaimana untuk membina pengimbas dokumen dalam Python?

王林
王林ke hadapan
2023-04-26 13:10:111691semak imbas

​Penterjemah |. Bugatti

Penyemak |. Walau apa pun, menulis atur cara untuk menukar foto dokumen kertas kepada format separa adalah apa yang Python mahir.

Menggunakan gabungan perpustakaan yang sesuai, anda boleh membina aplikasi kecil untuk mendigitalkan dokumen. Program anda akan mengambil imej dokumen fizikal sebagai input, menggunakan beberapa teknik pemprosesan imej padanya dan mengeluarkan versi input yang diimbas.

1. Sediakan persekitaran

Pertama sekali, anda harus biasa dengan asas Python, dan anda juga perlu tahu cara menggunakan perpustakaan NumPy Python .

Buka mana-mana IDE Python dan buat dua fail Python. Namakan satu main.py dan satu lagi transform.py. Kemudian laksanakan arahan berikut pada terminal untuk memasang perpustakaan yang diperlukan.

Anda akan menggunakan OpenCV-Python untuk mengambil input imej dan melakukan beberapa pemprosesan imej, menggunakan Imutils untuk mengubah saiz imej input dan output, dan menggunakan imej scikit untuk ambang imej. NumPy akan membantu anda dengan tatasusunan.

pip install OpenCV-Python imutils scikit-image NumPy

Bagaimana untuk membina pengimbas dokumen dalam Python?Tunggu pemasangan selesai dan IDE mengemas kini tulang belakang projek. Setelah kandungan tulang belakang dikemas kini, anda boleh memulakan pengaturcaraan. Kod sumber lengkap boleh didapati dalam repositori GitHub.

2. Import pustaka yang dipasang

Buka fail main.py dan import pustaka yang dipasang. Ini akan membolehkan anda memanggil dan menggunakan fungsi mereka apabila perlu.

Abaikan ralat yang dilemparkan oleh perspective_transform. Setelah anda selesai memproses fail transform.py, ralat akan hilang.
import cv2
import imutils
from skimage.filters import threshold_local
from transform import perspective_transform

3. Dapatkan dan ubah saiz input

Ambil imej yang jelas bagi dokumen yang ingin anda imbas. Pastikan keempat-empat penjuru dokumen dan kandungannya kelihatan. Salin imej ke folder yang sama di mana fail program disimpan.

Bagaimana untuk membina pengimbas dokumen dalam Python? Lulus laluan imej input ke OpenCV. Buat salinan imej asal kerana anda memerlukannya semasa transformasi perspektif. Bahagikan ketinggian imej asal dengan ketinggian yang anda mahu ubah saiznya. Ini akan mengekalkan nisbah aspek. Akhirnya, imej yang dilaraskan adalah output.

Keluaran kod di atas adalah seperti berikut:
# Passing the image path
original_img = cv2.imread('sample.jpg')
copy = original_img.copy()

# The resized height in hundreds
ratio = original_img.shape[0] / 500.0
img_resize = imutils.resize(original_img, height=500)

# Displaying output
cv2.imshow('Resized image', img_resize)

# Waiting for the user to press any key
cv2.waitKey(0)

Bagaimana untuk membina pengimbas dokumen dalam Python?Kini anda Ketinggian imej asal telah dilaraskan kepada 500 piksel.

4. Tukar imej yang dilaraskan kepada imej skala kelabu

Tukar imej RGB yang dilaraskan kepada imej skala kelabu. Kebanyakan perpustakaan pemprosesan imej hanya mengendalikan imej skala kelabu kerana ia lebih mudah untuk diproses.

Perhatikan perbezaan antara imej asal dan imej skala kelabu.
gray_image = cv2.cvtColor(img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow('Grayed Image', gray_image)
cv2.waitKey(0)

Output program menunjukkan imej kelabu pada IDE

Bagaimana untuk membina pengimbas dokumen dalam Python?

Jadual warna menjadi jadual hitam putih.

5. Gunakan pengesan tepi

Gunakan penapis kabur Gaussian pada imej skala kelabu untuk mengeluarkan bunyi. Fungsi OpenCV canny kemudiannya dipanggil untuk mengesan tepi yang terdapat dalam imej.

Tepi kelihatan pada output.
blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
edged_img = cv2.Canny(blurred_image, 75, 200)
cv2.imshow('Image edges', edged_img)
cv2.waitKey(0)

Bagaimana untuk membina pengimbas dokumen dalam Python?Tepi yang anda akan gunakan ialah tepi dokumen.

6 Cari kontur terbesar

Kesan kontur dalam imej tepi. Isih dalam tertib menurun, kekalkan hanya lima kontur terbesar. Dengan menyusun kontur secara kitaran, kontur empat sisi terbesar diperoleh kira-kira.

Garis dengan empat sisi berkemungkinan mengandungi dokumen.
cnts, _ = cv2.findContours(edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
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:
doc = approx
break

7. Bulatkan empat sudut garis besar dokumen

Bulatkan beberapa sudut garis besar dokumen yang dikesan. Ini akan membantu anda menentukan sama ada program anda dapat mengesan dokumen dalam imej.

Bulatkan beberapa penjuru imej RGB yang dilaraskan.
p = []

for d in doc:
tuple_point = tuple(d[0])
cv2.circle(img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append(tuple_point)

cv2.imshow('Circled corner points', img_resize)
cv2.waitKey(0)

Bagaimana untuk membina pengimbas dokumen dalam Python?Selepas mengesan dokumen, anda kini perlu mengeluarkannya daripada imej.

8. Gunakan perspektif meledingkan untuk mendapatkan imej yang diingini

Perspektif Warp ialah teknik penglihatan komputer yang digunakan untuk mengubah imej untuk membetulkan herotan. Ia mengubah imej menjadi satah yang berbeza, membolehkan anda melihat imej dari sudut yang berbeza.

Untuk mendapatkan imej yang herot, anda perlu mencipta modul mudah untuk melakukan transformasi perspektif.
warped_image = perspective_transform(copy, doc.reshape(4, 2) * ratio)
warped_image = cv2.cvtColor(warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Warped Image", imutils.resize(warped_image, height=650))
cv2.waitKey(0)

9. Modul penukaran

该模块将对文档角的点进行排序。它还会将文档图像转换成不同的平面,并将相机角度更改为俯拍。

打开之前创建的那个transform.py文件,导入OpenCV库和NumPy库。

import numpy as np
import cv2

这个模块将含有两个函数。创建一个对文档角点的坐标进行排序的函数。第一个坐标将是左上角的坐标,第二个将是右上角的坐标,第三个将是右下角的坐标,第四个将是左下角的坐标。

def order_points(pts):
 # initializing the list of coordinates to be ordered
 rect = np.zeros((4, 2), dtype = "float32")

 s = pts.sum(axis = 1)

 # top-left point will have the smallest sum
 rect[0] = pts[np.argmin(s)]

 # bottom-right point will have the largest sum
 rect[2] = pts[np.argmax(s)]

 '''computing the difference between the points, the
 top-right point will have the smallest difference,
 whereas the bottom-left will have the largest difference'''
 diff = np.diff(pts, axis = 1)
 rect[1] = pts[np.argmin(diff)]
 rect[3] = pts[np.argmax(diff)]

 # returns ordered coordinates
 return rect

创建将计算新图像的角坐标,并获得俯拍的第二个函数。然后,它将计算透视变换矩阵,并返回扭曲的图像。

def perspective_transform(image, pts):
 # unpack the ordered coordinates individually
 rect = order_points(pts)
 (tl, tr, br, bl) = rect

 '''compute the width of the new image, which will be the
 maximum distance between bottom-right and bottom-left
 x-coordinates or the top-right and top-left x-coordinates'''
 widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
 widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
 maxWidth = max(int(widthA), int(widthB))

 '''compute the height of the new image, which will be the
 maximum distance between the top-left and bottom-left y-coordinates'''
 heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
 heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
 maxHeight = max(int(heightA), int(heightB))

 '''construct the set of destination points to obtain an overhead shot'''
 dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype = "float32")

 # compute the perspective transform matrix
 transform_matrix = cv2.getPerspectiveTransform(rect, dst)

 # Apply the transform matrix
 warped = cv2.warpPerspective(image, transform_matrix, (maxWidth, maxHeight))

 # return the warped image
 return warped

现在您已创建了转换模块。perspective_transform导入方面的错误现在将消失。

Bagaimana untuk membina pengimbas dokumen dalam Python?

注意,显示的图像有俯拍。

10、运用自适应阈值,保存扫描输出

在main.py文件中,对扭曲的图像运用高斯阈值。这将给扭曲的图像一个扫描后的外观。将扫描后的图像输出保存到含有程序文件的文件夹中。

T = threshold_local(warped_image, 11, offset=10, method="gaussian")
warped = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+'scan'+'.png',warped)

以PNG格式保存扫描件可以保持文档质量。

11、显示输出

输出扫描后文档的图像:

cv2.imshow("Final Scanned image", imutils.resize(warped, height=650))
cv2.waitKey(0)
cv2.destroyAllWindows()

下图显示了程序的输出,即扫描后文档的俯拍。

Bagaimana untuk membina pengimbas dokumen dalam Python?

12、计算机视觉在如何进步?

创建文档扫描器涉及计算机视觉的一些核心领域,计算机视觉是一个广泛而复杂的领域。为了在计算机视觉方面取得进步,您应该从事有趣味又有挑战性的项目。

您还应该阅读如何将计算机视觉与当前前技术结合使用方面的更多信息。这让您能了解情况,并为所处理的项目提供新的想法。

原文链接:https://www.makeuseof.com/python-create-document-scanner/

Atas ialah kandungan terperinci Bagaimana untuk membina pengimbas dokumen dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam