Fiziksel alandan tasarruf etmek veya kayıtlı bir yedek oluşturmak için bir belgeyi sayısallaştırmak isteyebilirsiniz. Her iki durumda da, kağıt dosyalarınızın fotoğraflarını standart bir biçime dönüştürebilen bir program yazmak, Python'un üstün olduğu bir görevdir.
Uygun kitaplıkların bir kombinasyonunu kullanarak belgeleri dijitalleştirmek için küçük bir uygulama oluşturabilirsiniz. Programınız fiziksel bir belgenin görüntüsünü girdi olarak alacak, ona birkaç görüntü işleme tekniği uygulayacak ve girdinin taranmış bir sürümünü çıktı olarak alacaktır.
Ortamınızı Hazırlamak
Bu makaleyi takip etmek için aşağıdakilere aşina olmalısınız: Python'un temelleri. Ayrıca bir anlayışa sahip olmanız gerekir. NumPy Python kitaplığı ile nasıl çalışılır.
Herhangi bir Python IDE'yi açın ve iki Python dosyası oluşturun. Birine main.py ve diğerini transform.py olarak adlandırın. Ardından, gerekli kitaplıkları yüklemek için terminalde aşağıdaki komutu çalıştırın.
pip kurulumu OpenCV-Python imutils scikit-image NumPy
Görüntü girdisini almak ve bazı görüntü işlemeleri gerçekleştirmek için OpenCV-Python kullanacaksınız. Girdi ve çıktı resimlerini yeniden boyutlandırmak için Imutils. scikit-image görüntüye bir eşik uygulamak için. NumPy, dizilerle çalışmanıza yardımcı olacaktır.
Kurulumun bitmesini ve IDE'nin proje iskeletlerini güncellemesini bekleyin. İskelet güncellemesi tamamlandıktan sonra kodlamaya başlamaya hazırsınız. Tam kaynak kodu bir GitHub deposu.
Yüklü Kitaplıkları İçe Aktarma
main.py dosyasını açın ve ortama yüklediğiniz kitaplıkları içe aktarın. Bu, gerektiğinde işlevlerini aramanızı ve kullanmanızı sağlayacaktır.
içe aktarmak CV2
içe aktarmak imutils
itibaren skimage.filters içe aktarmak eşik_yerel
itibaren dönüştürmek içe aktarmak perspektif_dönüşümü
Perspective_transform'da atılan hatayı yok sayın. transform.py dosyası üzerinde çalışmayı bitirdiğinizde kaybolacaktır.
Girdiyi Alma ve Yeniden Boyutlandırma
Taramak istediğiniz belgenin net bir görüntüsünü çekin. Belgenin ve içeriğinin dört köşesinin görünür olduğundan emin olun. Görüntüyü, program dosyalarını sakladığınız klasöre kopyalayın.
Giriş görüntüsü yolunu OpenCV'ye iletin. Perspektif dönüştürme sırasında ihtiyaç duyacağınız için orijinal görüntünün bir kopyasını yapın. Orijinal görüntünün yüksekliğini, yeniden boyutlandırmak istediğiniz yüksekliğe bölün. Bu, en boy oranını koruyacaktır. Son olarak, yeniden boyutlandırılmış görüntünün çıktısını alın.
# Görüntü yolunu geçmek
orijinal_img = cv2.imread('örnek.jpg')
kopya = orijinal_img.kopya()# Yüzlerce yeniden boyutlandırılmış yükseklik
oran = orijinal_img.shape[0] / 500.0
img_resize = imutils.resize (original_img, yükseklik=500)# Çıktı gösteriliyor
cv2.imshow("Resim yeniden boyutlandırıldı", img_resize)
# Kullanıcının herhangi bir tuşa basması bekleniyor
cv2.waitKey(0)
Yukarıdaki kodun çıktısı aşağıdaki gibidir:
Artık orijinal görüntünün yüksekliğini 500 piksel olarak yeniden boyutlandırdınız.
Yeniden Boyutlandırılmış Görüntüyü Gri Tonlamaya Dönüştürme
Yeniden boyutlandırılmış RGB görüntüsünü gri tonlamaya dönüştürün. Görüntü işleme kitaplıklarının çoğu, işlenmesi daha kolay olduğundan yalnızca gri tonlamalı görüntülerle çalışır.
gray_image = cv2.cvtColor (img_resize, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gri Görüntü", gray_image)
cv2.waitKey(0)
Orijinal görüntü ile gri olan arasındaki farka dikkat edin.
Renkli tablo siyah beyaza döndü.
Kenar Dedektörü Uygulama
Gürültüyü gidermek için grileştirilmiş görüntüye bir Gauss bulanıklık filtresi uygulayın. Ardından, görüntüde bulunan kenarları algılamak için OpenCV canny işlevini çağırın.
blurred_image = cv2.GaussianBlur (gray_image, (5, 5), 0)
edged_img = cv2.Canny (bulanık_görüntü, 75, 200)
cv2.imshow("Görüntü kenarları", kenarlı_img)
cv2.waitKey(0)
Kenarlar çıktıda görünür.
Çalışacağınız kenarlar belgenin kenarlarıdır.
En Büyük Konturu Bulmak
Kenarlı görüntüde bulunan konturları algılayın. Yalnızca en büyük beş konturu koruyarak bunları azalan düzende sıralayın. Sıralanan konturları döngüye sokarak dört kenarlı en büyük konturu yaklaşık olarak hesaplayın.
cnts, _ = cv2.findContours (edged_img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = sıralanmış (cnts, key=cv2.contourArea, reverse=Doğru)[:5]için C içinde cnts:
peri = cv2.arcLength (c, Doğru)
yaklaşık = cv2.approxPolyDP(c, 0.02 * peri, Doğru)
eğer uzunluk (yaklaşık) == 4:
doktor = yaklaşık
kırmak
Dört kenarlı kontur muhtemelen belgeyi içerecektir.
Belge Konturunun Dört Köşesini Daire içine Alma
Algılanan belge konturunun köşelerini daire içine alın. Bu, programınızın görüntüdeki belgeyi algılayıp algılamadığını belirlemenize yardımcı olacaktır.
p = []
için D içinde doktor:
demet_noktası = demet (d[0])
cv2.circle (img_resize, tuple_point, 3, (0, 0, 255), 4)
p.append (tuple_point)
cv2.imshow("Daire içine alınmış köşe noktaları", img_resize)
cv2.waitKey(0)
Yeniden boyutlandırılan RGB görüntüsünde daire çizmeyi uygulayın.
Belgeyi algıladıktan sonra, şimdi belgeyi görüntüden çıkarmanız gerekir.
İstenen Görüntüyü Elde Etmek İçin Çözgü Perspektifini Kullanma
Çözgü perspektifi, bir görüntüyü bozulmaları düzeltmek için dönüştürmek için kullanılan bir bilgisayarla görme tekniğidir. Görüntüyü farklı bir açıdan görmenizi sağlayan farklı bir düzleme dönüştürür.
warped_image = perspektif_dönüşümü (kopya, doc.reshape(4, 2) * oran)
warped_image = cv2.cvtColor (warped_image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Çarpılmış Görüntü", imutils.resize (çarpık_resim, yükseklik=650))
cv2.waitKey(0)
Çarpık bir görüntü elde etmek için yapmanız gerekenler basit bir modül oluştur perspektif dönüşümünü gerçekleştirecek.
Dönüşüm Modülü
Modül, belge köşelerinin noktalarını sıralayacaktır. Ayrıca belge görüntüsünü farklı bir düzleme dönüştürecek ve kamera açısını tepeden çekime değiştirecektir.
Daha önce oluşturduğunuz transform.py dosyasını açın. OpenCV ve NumPy kitaplıklarını içe aktarın.
içe aktarmak dizi gibi np
içe aktarmak CV2
Bu modül iki fonksiyon içerecektir. Belge köşe noktalarının koordinatlarını sıralayacak bir işlev oluşturun. İlk koordinat sol üst köşenin koordinatı olacak, ikincisi sağ üst köşenin koordinatı olacak, üçüncüsü sağ alt köşede olacak ve dördüncü koordinat sol alt köşede olacak köşe.
kesinliklesipariş_noktaları(puan):
# sipariş edilecek koordinat listesinin başlatılması
rect = np.sıfır((4, 2), dtipi = "şamandıra32")s = pts.sum (eksen = 1)
# sol üst nokta en küçük toplamına sahip olacak
düz[0] = puan[np.argmin (s)]# sağ alt nokta en büyük toplama sahip olacak
düz[2] = puan[np.argmax(s)]noktalar arasındaki farkın hesaplanması,
sağ üst nokta en küçük farka sahip olacak,
oysa sol alt en büyük farka sahip olacak
fark = np.diff (puan, eksen = 1)
düz[1] = puan[np.argmin (fark)]
düz[3] = puan[np.argmaks (fark)]
# sıralı koordinatları döndürür
geri dönmek doğru
Yeni görüntünün köşe koordinatlarını hesaplayacak ve bir üstten çekim elde edecek ikinci bir işlev oluşturun. Daha sonra perspektif dönüşüm matrisini hesaplayacak ve çarpık görüntüyü döndürecektir.
kesinlikleperspektif_dönüşümü(resim, puan):
# sipariş edilen koordinatları tek tek açın
rect = order_points (puan)
(tl, tr, br, bl) = doğruolacak yeni görüntünün genişliğini hesaplayın.
sağ alt arasındaki maksimum mesafe Ve sol alt
x koordinatları veya sağ üst Ve sol üst x koordinatları
genişlikA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
genişlikB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
maksGenişlik = maks (int (genişlikA), int (genişlikB))olacak yeni görüntünün yüksekliğini hesaplayın.
sol üst arasındaki maksimum mesafe Ve sol alt y koordinatları
yükseklikA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
yükseklikB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
maksYükseklik = maks (int (yükseklikA), int (yükseklikB))tepeden bir atış elde etmek için varış noktaları kümesini oluşturun
dst = np.array([
[0, 0],
[maksimum genişlik - 1, 0],
[maksimum genişlik - 1, maksimum yükseklik - 1],
[0, maksimum yükseklik - 1]], dtipi = "şamandıra32")# perspektif dönüşüm matrisini hesapla
transform_matrix = cv2.getPerspectiveTransform (doğrudan, dst)# Dönüşüm matrisini uygula
çarpık = cv2.warpPerspective (resim, transform_matrix, (maxWidth, maxHeight))
# çarpık görüntüyü döndür
geri dönmek çarpık
Artık dönüştürme modülünü oluşturdunuz. Perspective_transform içe aktarmadaki hata artık kaybolacak.
Görüntülenen görüntünün üstten bir çekimi olduğuna dikkat edin.
Uyarlanabilir Eşik Uygulama ve Taranan Çıktıyı Kaydetme
main.py dosyasında, çarpık görüntüye Gauss eşiğini uygulayın. Bu, çarpık görüntüye taranmış bir görünüm verecektir. Taranan görüntü çıktısını program dosyalarını içeren klasöre kaydedin.
T = eşik_yerel (çarpık_görüntü, 11, ofset=10, yöntem="gauss")
çarpılmış = (warped_image > T).astype("uint8") * 255
cv2.imwrite('./'+'tarama'+".png",bükülmüş)
Taramayı PNG biçiminde kaydetmek belge kalitesini korur.
Çıktıyı Görüntüleme
Taranan belgenin görüntüsünün çıktısını alın:
cv2.imshow("Son Taranan görüntü", imutils.resize (çarpık, yükseklik=650))
cv2.waitKey(0)
cv2.destroyAllWindows()
Aşağıdaki görüntü, programın çıktısını, taranan belgenin üstten bir görüntüsünü gösterir.
Bilgisayarla Görmede Nasıl İlerlenir?
Bir belge tarayıcı oluşturmak, geniş ve karmaşık bir alan olan bilgisayarla görmenin bazı temel alanlarını kapsar. Bilgisayar görüşünde ilerlemek için ilginç ama zorlu projeler üzerinde çalışmalısınız.
Bilgisayar görüşünün güncel teknolojilerle nasıl kullanılacağı hakkında da daha fazlasını okumalısınız. Bu sizi bilgilendirecek ve üzerinde çalışacağınız projeler için size yeni fikirler verecektir.