Pembaca seperti Anda membantu mendukung MUO. Saat Anda melakukan pembelian menggunakan tautan di situs kami, kami dapat memperoleh komisi afiliasi. Baca selengkapnya.

Anda mungkin ingin mendigitalkan dokumen untuk menghemat ruang fisik atau membuat cadangan penyimpanan. Either way, menulis sebuah program yang dapat mengkonversi foto dari file kertas Anda ke dalam format standar adalah tugas yang unggul di Python.

Menggunakan kombinasi pustaka yang sesuai, Anda dapat membuat aplikasi kecil untuk mendigitalkan dokumen. Program Anda akan mengambil gambar dari dokumen fisik sebagai input, menerapkan beberapa teknik pemrosesan gambar untuk itu, dan mengeluarkan versi input yang dipindai.

Mempersiapkan Lingkungan Anda

Untuk mengikuti artikel ini Anda harus terbiasa dengan dasar-dasar Python. Anda juga perlu memiliki pemahaman tentang cara bekerja dengan pustaka NumPy Python.

Buka sembarang IDE Python, dan buat dua file Python. Sebutkan satu main.py dan transform.py lainnya. Kemudian jalankan perintah berikut di terminal untuk menginstal pustaka yang diperlukan.

instagram viewer
pip instal OpenCV-Python imutils scikit-image NumPy

Anda akan menggunakan OpenCV-Python untuk mengambil input gambar dan melakukan beberapa pemrosesan gambar. Imutils untuk mengubah ukuran gambar input dan output. scikit-image untuk menerapkan ambang pada gambar. NumPy akan membantu Anda bekerja dengan array.

Tunggu instalasi selesai dan IDE memperbarui kerangka proyek. Setelah pembaruan kerangka selesai, Anda siap untuk memulai pengkodean. Kode sumber lengkap tersedia di a repositori GitHub.

Mengimpor Perpustakaan yang Terpasang

Buka file main.py, dan impor pustaka yang Anda instal di lingkungan. Ini akan memungkinkan Anda untuk memanggil dan menggunakan fungsinya jika diperlukan.

impor cv2
impor imutil
dari skimage.filters impor threshold_local
dari mengubah impor perspektif_transformasi

Abaikan kesalahan yang terjadi pada perspektif_transform. Itu akan hilang ketika Anda selesai mengerjakan file transform.py.

Mengambil dan Mengubah Ukuran Input

Ambil gambar yang jelas dari dokumen yang ingin Anda pindai. Pastikan keempat sudut dokumen dan isinya terlihat. Salin gambar ke folder yang sama tempat Anda menyimpan file program.

Lewati jalur gambar input ke OpenCV. Buat salinan gambar asli karena Anda akan membutuhkannya selama transformasi perspektif. Bagi tinggi gambar asli dengan tinggi yang ingin Anda ubah ukurannya. Ini akan mempertahankan rasio aspek. Akhirnya, keluarkan gambar yang diubah ukurannya.

# Melewati jalur gambar
original_img = cv2.imread('sampel.jpg')
salin = original_img.copy()

# Tinggi yang diubah ukurannya dalam ratusan
rasio = gambar_asli.bentuk[0] / 500.0
img_resize = imutils.resize (img_asli, tinggi=500)

# Menampilkan keluaran
cv2.imshow('Mengubah ukuran gambar', img_resize)

# Menunggu pengguna menekan tombol apa saja
cv2.waitKey(0)

Output dari kode di atas adalah sebagai berikut:

Anda sekarang telah mengubah ukuran tinggi gambar asli menjadi 500 piksel.

Mengubah Gambar yang Diubah Ukurannya menjadi Grayscale

Ubah ukuran gambar RGB menjadi skala abu-abu. Sebagian besar pustaka pemrosesan gambar hanya berfungsi dengan gambar skala abu-abu karena lebih mudah diproses.

gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gambar Abu-abu', gray_image)
cv2.waitKey(0)

Perhatikan perbedaan antara gambar asli dan yang berwarna abu-abu.

Meja berwarna telah berubah menjadi hitam dan putih.

Menerapkan Detektor Tepi

Terapkan filter Gaussian blur pada gambar berwarna abu-abu untuk menghilangkan noise. Kemudian panggil fungsi canny OpenCV untuk mendeteksi tepi yang ada pada gambar.

blur_image = cv2.GaussianBlur (gray_image, (5, 5), 0)
edged_img = cv2.Canny (gambar_kabur, 75, 200)
cv2.imshow('Tepi gambar', edge_img)
cv2.waitKey(0)

Tepi terlihat pada output.

Tepi yang akan Anda kerjakan adalah bagian dari dokumen.

Menemukan Kontur Terbesar

Mendeteksi kontur yang ada pada gambar tepi. Urutkan mereka dalam urutan menurun hanya dengan mempertahankan lima kontur terbesar. Perkirakan kontur terbesar dengan empat sisi dengan mengulang melalui kontur yang diurutkan.

cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = diurutkan (cnts, key=cv2.contourArea, mundur=BENAR)[:5]

untuk C di dalam cnt:
peri = cv2.arcLength (c, BENAR)
kira-kira = cv2.approxPolyDP(c, 0.02 * peri, BENAR)

jika len (perkiraan) == 4:
dok = kira-kira
merusak

Kontur dengan empat sisi kemungkinan berisi dokumen.

Mengitari Empat Sudut Kontur Dokumen

Lingkari sudut kontur dokumen yang terdeteksi. Ini akan membantu Anda menentukan apakah program Anda dapat mendeteksi dokumen dalam gambar.

p = []

untuk D di dalam dokter:
tuple_point = tupel (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.tambahkan (tuple_point)

cv2.imshow('Titik sudut yang dilingkari', img_resize)
cv2.waitKey(0)

Terapkan lingkaran pada gambar RGB yang diubah ukurannya.

Setelah mendeteksi dokumen, Anda sekarang perlu mengekstrak dokumen dari gambar.

Menggunakan Perspektif Warp untuk Mendapatkan Gambar yang Diinginkan

Perspektif warp adalah teknik visi komputer untuk mengubah gambar menjadi distorsi yang benar. Itu mengubah gambar menjadi bidang yang berbeda memungkinkan Anda untuk melihat gambar dari sudut yang berbeda.

warped_image = perspektif_transformasi (salin, doc.reshape(4, 2) * rasio)
warped_image = cv2.cvtColor (warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gambar Bengkok", imutils.resize (warped_image, height=650))
cv2.waitKey(0)

Untuk mendapatkan gambar yang bengkok, Anda harus melakukannya membuat modul sederhana yang akan melakukan transformasi perspektif.

Modul Transformasi

Modul akan mengurutkan titik sudut dokumen. Ini juga akan mengubah gambar dokumen menjadi bidang yang berbeda dan mengubah sudut kamera menjadi bidikan di atas kepala.

Buka file transform.py yang Anda buat sebelumnya. Impor pustaka OpenCV dan NumPy.

impor numpy sebagai np
impor cv2

Modul ini akan berisi dua fungsi. Buat fungsi yang akan mengurutkan koordinat titik sudut dokumen. Koordinat pertama adalah sudut kiri atas, yang kedua adalah sudut kanan atas, koordinat ketiga adalah sudut kanan bawah, dan koordinat keempat adalah koordinat kiri bawah sudut.

deforder_points(poin):
# menginisialisasi daftar koordinat yang akan dipesan
persegi = np.nol((4, 2), tipe d = "float32")

s = pts.sum (sumbu = 1)

# titik kiri atas akan memiliki jumlah terkecil
lurus[0] = poin[np.argmin (s)]

# titik kanan bawah akan memiliki jumlah terbesar
lurus[2] = poin[np.argmax (s)]

menghitung perbedaan antara poin, yang
titik kanan atas akan memiliki perbedaan terkecil,
sedangkan kiri bawah akan memiliki perbedaan terbesar
diff = np.diff (poin, sumbu = 1)
lurus[1] = poin[np.argmin (beda)]
lurus[3] = poin[np.argmax (beda)]

# mengembalikan koordinat yang dipesan
kembali lurus

Buat fungsi kedua yang akan menghitung koordinat sudut gambar baru dan mendapatkan bidikan overhead. Ini kemudian akan menghitung matriks transformasi perspektif dan mengembalikan gambar yang bengkok.

defperspektif_transformasi(gambar, poin):
# bongkar koordinat yang dipesan satu per satu
rect = poin_urutan (poin)
(tl, tr, br, bl) = persegi

menghitung lebar gambar baru, yang akan menjadi
jarak maksimum antara kanan bawah Dan kiri bawah
koordinat x atau kanan atas Dan koordinat x kiri atas
lebarA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
lebarB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maxWidth = maks (int (lebarA), int (lebarB))

menghitung ketinggian gambar baru, yang akan menjadi
jarak maksimum antara kiri atas Dan koordinat y kiri bawah
tinggiA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
tinggiB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maksTinggi = maks (int (tinggiA), int (tinggiB))

membangun set poin tujuan untuk mendapatkan tembakan overhead
dst = np.array([
[0, 0],
[Lebarmaks - 1, 0],
[Lebarmaks - 1, tinggi maksimal - 1],
[0, tinggi maksimal - 1]], tipe d = "float32")

# menghitung matriks transformasi perspektif
transform_matrix = cv2.getPerspectiveTransform (persegi, dst)

# Terapkan matriks transformasi
warped = cv2.warpPerspective (gambar, transform_matrix, (maxWidth, maxHeight))

# mengembalikan gambar yang bengkok
kembali melengkung

Anda sekarang telah membuat modul transformasi. Kesalahan pada impor perspektif_transform sekarang akan hilang.

Perhatikan bahwa gambar yang ditampilkan memiliki bidikan overhead.

Menerapkan Ambang Batas Adaptif dan Menyimpan Output yang Dipindai

Di file main.py, terapkan ambang Gaussian ke gambar yang dibengkokkan. Ini akan memberikan tampilan yang dipindai pada gambar yang melengkung. Simpan keluaran gambar yang dipindai ke folder yang berisi file program.

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

Menyimpan pindaian dalam format PNG menjaga kualitas dokumen.

Menampilkan Keluaran

Keluarkan gambar dokumen yang dipindai:

cv2.imshow("Gambar pindaian akhir", imutils.resize (melengkung, tinggi=650))
cv2.waitKey(0)
cv2.hancurkanSemuaWindows()

Gambar berikut menunjukkan keluaran program, bidikan overhead dari dokumen yang dipindai.

Cara Memajukan dalam Computer Vision

Membuat pemindai dokumen mencakup beberapa area inti dari visi komputer, yang merupakan bidang yang luas dan kompleks. Untuk maju dalam visi komputer, Anda harus mengerjakan proyek yang menarik namun menantang.

Anda juga harus membaca lebih lanjut tentang bagaimana Anda dapat menggunakan visi komputer dengan teknologi terkini. Ini akan memberi Anda informasi dan memberi Anda ide-ide baru untuk proyek yang akan dikerjakan.