OpenCV ve Python ile Görüntü İşleme İçin Başlangıç ​​Kılavuzu

Kaynak Düğüm: 1074439

Bu makale, Veri Bilimi Blogathon

Giriş

Bir görüntünün içinde çok fazla bilgi saklı olabilir ve onu farklı şekillerde ve bakış açılarıyla yorumlayabiliriz. Peki, bir görüntü nedir ve bir görüntü ile nasıl başa çıkılır? Basit bir deyişle, bir görüntünün bir şeyin görsel bir temsili olduğunu ve bilgisayarla görme (makine öğrenimi perspektifinden) kullanılarak kolayca ele alınabileceğini söyleyebiliriz. Videolar ne olacak? Bir video, hareketli bir dizi görüntünün veya sürekli karelerin kaydı olarak tanımlanabilir. Ama bilgisayarla görme kullanan videoları başka bir blogda ele alabiliriz! 🙂

Bazılarınız Computer Vision'ı şimdiye kadar biliyor olabilir ve bu paragrafı atlayabilir, ancak bu konuda bir fikri olmayanlar için, daha çok 'CV' kısaltması ile bilinen Computer Vision, bir alan olarak söylenebilir. Tıp alanı, otomotiv, imalat, tarım vb. dahil olmak üzere bu modern çağda neredeyse tüm alanlarda yararlı bilgiler çıkaran Yapay Zeka.

OpenCV ile Görüntü İşleme | Bilgisayar görüşü

görüntü 1

Şu anda bu yazıyı okuyan bir insan olarak, bir görüntüde bulunan şeyleri veya öğeleri ayırt edebileceksiniz. Peki ya makineler? Onu kendi başına görüp ayırt etmeyi düşünebilirler mi? NUMARA? o zaman makinenizi yapalım.

Bu blogda, python kullanarak bilgisayarla görmenin temellerini öğreneceksiniz.

Python'da programlamak için Python Shell/Jupyter Notebook/PyCharm veya Visual Studio Code'u (birkaç isim) zaten yüklediğinize inanıyorum. Başlamak için yaygın olarak kullanılan paketi (OpenCV) kuralım ve her hücredeki kodları bir Jupyter Notebook'ta çalıştıracağız.

Görüntü Ön İşleme için OpenCV Paketini Kurma

OpenCV, bilgisayarla görme, makine öğrenimi ve görüntü işleme uygulamaları için yaygın olarak kullanılan, önceden oluşturulmuş, açık kaynaklı, yalnızca CPU içeren bir kitaplıktır (paket). Python dahil olmak üzere çok çeşitli programlama dillerini destekler.

OpenCV paketini aşağıdakileri kullanarak kurun:

pip kurulumu opencv-python

OR

pip kurulumu opencv-katkı-python

Bu komutlardan herhangi birini terminalinizde çalıştırın veya Anaconda Navigator – Jupyter Notebook kullanıyorsanız, “pip” i “conda” komutu ile değiştirebilir ve aynısını yükleyebilirsiniz.

Paketi İçe Aktarma

Python'da paket nedir? Python'daki bir paket, önceden yazılmış komut dosyalarını içeren bir modüller koleksiyonudur. Bu paketler, modülleri tamamen veya hatta tek tek içe aktarmamıza yardımcı olur. Paketi “cv2” modülünü şu şekilde çağırarak içe aktarabiliriz:

cv2 içe aktar

Resim Okuma

Dijital görüntüler şu şekilde sınıflandırılabilir; renkli görüntüler, gri ölçekli görüntüler, ikili görüntüler ve multispektral görüntüler. Renkli bir görüntü, her piksel için renk bilgilerini içerir. Tek renkleri gri tonları olan görüntüler gri tonlu görüntülerken, ikili görüntüde çoğunlukla siyah ve beyaz pikseller olmak üzere tam olarak iki renk bulunur. Multispektral görüntüler, belirli bir dalga boyunda elektromanyetik spektrum boyunca değişen görüntü verilerini yakalayan görüntülerdir.

Kodlama kısmına geri dönelim ve bir resim okuyalım, örneğin resim aşağıda gösterilmiştir:

okuma resmi | OpenCV ile Görüntü İşleme

Bu bir mandrill'in görüntüsü. Şu anda yerel dizinden görüntüyü okuyorum.

# cv2.imread(path_to_image_with_file_extension, işaret)

Kullanım kodu şuna benzer:

img = cv2.imread("mandrill.jpg", 1)

Burada görüntüyü okumak için cv2 paketinin “imread” yöntemini kullanıyoruz ve ilk parametre dosya adı ve uzantısı ile görüntünün yoluna karşılık geliyor, ikincisi ise ayarlayabileceğiniz yolu anlatan bayrak, resimde nasıl okunur. İsterseniz, görüntünün mutlak yolunu burada değiştirebilir ve yerel bilgisayarınızdan veya hatta internetten okumayı deneyebilirsiniz! Görüntü mevcut çalışma dizininizde mevcutsa, uzantı türüyle birlikte görüntü adını belirtmeniz yeterlidir.

İkinci parametreye gelince, eğer gri tonlamalı bir resim olarak okumak isterseniz, görüntüyü değişmemiş olarak okumak için parametreyi 0, -1 olarak belirleyebilirsiniz (görüntüyü alfa veya varsa şeffaflık kanalı olarak okur) ve varsayılan olarak renkli görüntü olarak 1'dir. Bu bağlantıdan diğer parametreleri de deneyebilirsiniz:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

ImreadModes altında.

Bir Resmin Özellikleri

Şekil:

Her görüntünün bir şekli vardır. Resmin gösterdiği sınırların uzunluğu, şekil, yani yükseklik ve genişlik olarak ifade edilebilir. Artık bir resmi nasıl okuyacağınızı bildiğinize göre, resmin şeklini kontrol etmeye ne dersiniz?

yazdır(img.şekil)

görüntünün şeklini yazdırmanın temel yoludur, ancak aşağıdakileri kullanarak şekli çıkarabiliriz:

h, w, c = img.shape print("Görüntünün boyutları:nnHeight:", h, "pixelsnWidth:", w, "pixelsnKanal Sayısı:", c)

daha iyi anlamak için.

Renk ve değişmeyen mod için, görüntüde bulunan yükseklik, genişlik ve kanal sayısı dahil olmak üzere 3 değer döndürür. Gri tonlama modunu kullandıysanız, şekil 2 olur, bu da görüntünün yüksekliğini ve genişliğini döndürür, ancak o zaman yalnızca h ve w değişkenlerini kullanmanız gerekir ("c" kullanımını hariç tutun), aksi takdirde alıyor olabilirsiniz. "açmak için yeterli değer yok (beklenen 3, 2 alındı)" diyen bir değer hatası.

Tip:

“Type” yöntemini kullanarak görüntünün türünü bilebiliriz. Bu yöntemi kullanmak, görüntü verilerinin nasıl temsil edildiğini bilmemize yardımcı olur. Kodu aşağıdaki gibi çalıştırın:

yazdır(tür(img))

Sonuç şöyle olabilir:

görüntü türü olarak Aynı tür ve boyuttaki öğelerin çok boyutlu bir kabıdır. Aşağıdaki bağlantıda N boyutlu diziye daha fazla başvurabilirsiniz:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

Az önce okuduğunuz görüntünün veri türü:

Görüntü N boyutlu bir dizi olduğundan, görüntünün veri türünü kontrol edebiliriz:

yazdır(img.dtype)

Görüntü piksel değerleri:

Bir görüntüyü bir dizi küçük örnek olarak düşünebiliriz. Bu örneklere piksel denir. Daha iyi bir anlayış için, bir resmi mümkün olduğunca yakınlaştırmayı deneyin. Aynı şeyi farklı karelere bölünmüş olarak görebiliriz. Bunlar piksellerdir ve bir araya geldiklerinde bir görüntü oluştururlar.

Bir görüntüyü temsil etmenin basit yollarından biri matris biçimindedir. Hatta bir matris kullanarak bir görüntü oluşturabilir ve kaydedebiliriz! Bu yazının ilerleyen bölümlerinde size nasıl olduğunu göstereceğim. Aşağıdaki bu resme bir göz atın:

Görüntü piksel değerleri | OpenCV ile Görüntü İşleme

görüntü 2

Bu resim daha çok bir görüntünün matris temsilinin nasıl göründüğünün bir örneğidir. Solda, Lincoln'ün bir görüntüsü, ortada, piksel değerleri, yoğunluklarını veya parlaklıklarını gösteren 0'dan 255'e kadar sayılarla etiketlenmiştir ve sağda, matristeki sayılar kendilerini oluşturur. Matristeki her değer, bir görüntüde bulunan en küçük bilgi öğesi olan bir piksele karşılık gelir. Görüntüyü yüklediğiniz değişkeni yazdırarak görüntü piksel değerlerini kontrol edin!

yazdır(img)

Görüntü çözünürlüğü:

Görüntü çözünürlüğü, bir görüntüde bulunan piksel sayısı olarak tanımlanabilir. Piksel sayısı arttıkça görüntünün kalitesi de artar. Satır ve sütun sayısını veren görüntünün şeklini daha önce görmüştük. Bu, o görüntünün çözünürlüğü olarak söylenebilir. Neredeyse herkesin bildiği standart çözünürlüklerden bazıları, 320 x 240 piksel (çoğunlukla küçük ekranlı cihazlarda uygundur), 1024 x 768 piksel (standart bilgisayar monitörlerinde görüntülenmeye uygundur), 720 x 576 pikseldir (standart tanımlı TV'de görüntülenmesi iyidir). 4:3 en boy oranına sahip setler), 1280 x 720 piksel (geniş ekran monitörlerde görüntülemek için),1280 x 1024 piksel (5:4 en boy oranına sahip LCD monitörlerde tam ekran boyutunda izlemek için iyi), 1920 x 1080 piksel (HD televizyonlarda izlemek için) ve şimdi ultra yüksek çözünürlüklü monitörler ve televizyonlar tarafından desteklenen sırasıyla 4 x 5 piksel, 8 × 3840 piksel ve 2160 x 5120 piksel olan 2880K, 7,680K ve 4,320K çözünürlüklerimiz bile var.

Sütun sayısı ile satır sayısını çarptığımızda görüntüde bulunan toplam piksel sayısını elde edebiliriz. Örneğin, 320 x 240 bir görüntüde, içinde bulunan toplam piksel sayısı 76,800 pikseldir.

Resmi Görüntüleme

Şimdi bir pencerede görüntünün nasıl görüntüleneceğini görelim. Bunun için görüntüyü ekranda görüntülemek için bir GUI penceresi oluşturmamız gerekiyor. İlk parametre, dizi biçiminde belirtilen GUI penceresi ekranının başlığı olmalıdır. Görüntüyü cv2.imshow() yöntemini kullanarak bir açılır pencerede gösterebiliriz. Ancak, kapatmaya çalıştığınızda, penceresine sıkışmış hissedebilirsiniz. Bununla mücadele etmek için basit bir “waitKey” yöntemini kullanabiliriz. Bu kod bölümünü yeni bir hücrede deneyin:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) ise k == 27 veya k == ord('q'): cv2.destroyAllWindows()

Burada biz kapatana kadar pencereyi açık tutmak için “waitKey”de '0' parametresini belirledik. (Ne kadar süre açılması gerektiğini belirterek süreyi 0 yerine milisaniye cinsinden de verebilirsiniz.) Bundan sonra 'ESC' tuşuna veya 'tuşuna bastığımızda pencereyi kapatmak için harekete geçecek değişkeni atayabiliriz. Q'. cv2.destroAllWindows() yöntemi, GUI pencerelerini ekrandan/bellekten kapatmak veya silmek için kullanılır.

Görüntüyü Kaydetme

Görüntüyü kaydetmeden önce, görüntüyü gri tonlamaya dönüştürerek kaydetmeye ne dersiniz? Aşağıdakileri kullanarak görüntüyü gri tonlamaya dönüştürün:

gri = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

Şimdi resmi kaydedebiliriz:

cv2.imwrite('Mandrill_grey.jpg', gri)

ve geçerli çalışma dizinine kaydedilmekte olan görüntüyü kontrol edin. İlk parametre görüntünün kaydedileceği dosyanın adına karşılık gelir ve ikinci parametre görüntüyü içeren değişkendir (piksel bilgisi).

Görüntü bit düzlemlerinin çıkarılması ve yeniden yapılandırılması

Bir görüntüyü farklı bit düzlemlerine bölebiliriz. Örneğin, bir görüntüyü 8 bitlik (0-7) düzlemlere bölün, burada son birkaç düzlem bir görüntü için bilgilerin çoğunu içerir.

küçük planlar

görüntü 3

Bunu yapmak için iki paket daha içe aktarabiliriz:

matplotlib.pyplot'u plt olarak içe aktar, numpy'yi np olarak içe aktar

Paketlerden herhangi birini içe aktarırken bir hata alırsanız, aşağıdakileri kullanarak yükleyebilirsiniz:

conda kurulumu -c conda-forge matplotlib conda kurulumu -c anaconda numpy

Şimdi görüntünün 8 seviyeli bit düzlemlerinin her birini çıkarmak için bir fonksiyon tanımlıyoruz.

def extract_bit_plane(cd): # tüm bitleri birer birer çıkarma # değişkeninde # 1'den 8'e sırasıyla c1'den c8'e c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.floor(cd/4), 2) c4 = np.mod(np.floor(cd/8), 2) c5 = np.mod(np.floor(cd/16) ), 2) c6 = np.mod(np.floor(cd/32), 2) c7 = np.mod(np.floor(cd/64), 2) c8 = np.mod(np.floor(cd/) 128), 2) # orijinal gri tonlamalı görüntüye eşdeğer oluşturmak için görüntüyü yeniden birleştirme cc = 2 * (2 * (2 * c8 + c7) + c6) # en önemli 3 bit düzlemi ile görüntüyü yeniden yapılandırma to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, axes = plt.subplots(nrows=2, ncols=5,figsize=(10, 8), subplot_kw={'xticks': [], ' yticks': []}) ax için fig.subplots_adjust(hspace=0.05, wspace=0.05), i in zip(axes.flat, to_plot): ax.imshow(i, cmap='gray') plt.tight_layout() plt.show() cc'yi döndür

Artık fonksiyonu çağırmaya hazırız.

reconstructed_image = extract_bit_plane(gri)

Son üç bit düzlemi, yani altıncı, yedinci ve sekizinci düzlemleri kullanarak görüntüyü (neredeyse benzer) yeniden oluşturduk. Ve sonuç şöyle görünür:

yeniden görüntü | OpenCV ile Görüntü İşleme

Kendi başımıza küçük bir imaj oluşturmaya ne dersiniz? Şimdi deneyelim!

Küçük bir sentetik görüntü oluşturma

Dört farklı piksel yoğunluğu değerine sahip dört eşmerkezli kare içeren sentetik bir görüntü üretmeyi deneyebiliriz,

40, 80, 160 ve 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # üst satır con_img[:, :32] = 40 #sol sütun con_img[:, 224:256] = 40 # sağ sütun con_img[224:, :] = 40 # alt satır con_img[32:64, 32:224] = 80 # üst satır con_img[64:224, 32:64] = 80 # sol sütun con_img[64:224, 192: 224] = 80 # sağ sütun con_img[192:224, 32:224] = 80 # alt satır con_img[64:96, 64:192] = 160 # üst satır con_img[96:192, 64:96] = 160 # sol sütun con_img[96:192, 160:192] = 160 # sağ sütun con_img[160:192, 64:192] = 160 # alt satır con_img[96:160, 96:160] = 220 plt.imshow(con_img)

Ortaya çıkan görüntü şöyle görünecektir:

çıktı

Görüntüler üzerinde çeşitli filtreler ve dönüşümler kullanmayı başka bir yazıda inceleyebiliriz.

Makaleyi okuduğunuz için teşekkür ederiz.

mem

görüntü 4

Önerilerinizi yorumların altına eklemekten ve bu makaleyi beğendiyseniz paylaşmaktan çekinmeyin. Bu makalede bahsedilen Jupyter Notebook'taki Python programlama kodunun tamamı Github depomda mevcuttur:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

Referanslar:

  1. Resim 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Resim 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Resim 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

Bu makalede gösterilen medya Analytics Vidhya'ya ait değildir ve Yazarın takdirine bağlı olarak kullanılır.

Kaynak: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Zaman Damgası:

Den fazla Analitik Vidhya