Görüntü İşleme OpenCV

Goruntu Isleme Opencv



Bu yazımızda görüntü işleme yöntemlerini inceleyeceğiz. Bilgisayarla görme ve makine öğrenimindeki bazı temel ama kritik konuları inceleyeceğiz. Bu temel görüntü işleme teknikleri, veri kümeleri gibi karmaşık sorunları çözebilir. Sonuç olarak, görüntü işlemede aşağıda listelenen altı temel adım vardır:
  1. Resim Çevirisi
  2. Görüntü Döndürme
  3. Görüntü Aritmetiği
  4. Görüntü Çevirme
  5. Görüntü Kırpma
  6. Görüntü Yeniden Boyutlandırma

Şimdi yukarıda bahsettiğimiz tüm görüntü işleme konularını detaylı bir şekilde anlatacağız.

1. Görsel Çeviri

Görüntü çevirisi, görüntüyü x ve y eksenleri boyunca hareket ettirmemize yardımcı olan bir görüntü işleme yöntemidir. Görüntüyü yukarı, aşağı, sağa, sola veya herhangi bir kombinasyonda hareket ettirebiliriz.







Çeviri Matrisini M sembolü ile tanımlayabilir ve aşağıda gösterildiği gibi matematiksel formda gösterebiliriz:





Çeviri görseli kavramını bu program sayesinde anlayabiliriz.





Python kodu: Aşağıdaki programın adını şu şekilde tutacağız: çeviri.py .

# gerekli paketleri içe aktar

içe aktarmak dizi olarak Örneğin.

içe aktarmak bağımsız değişken

içe aktarmak imutil

içe aktarmak CV2

# bağımsız değişken ayrıştırıcısını uyguluyoruz

ap_obj = arg ayrıştırma ArgümanAyrıştırıcı ( )

ap_obj. add_argument ( '-k' , '--resim' , gereklidir = Doğru ,

Yardım Edin = 'resim dosyasının konumu' )

argümanlar = kimin ( ap_obj. ayrıştırma_args ( ) )

# görüntüyü yükleyin ve ekranda gösterin

görüntü = CV2. imread ( argümanlar [ 'resim' ] )

CV2. gösteri ( 'Orijinal fotoğraf' , resim )

# Görüntünün çevirisi, aşağıda verilen bir NumPy matrisidir:

# [[1, 0, shiftX], [0, 1, shiftY]]

# Görüntüleri kaydırmak için yukarıdaki NumPy matrisini kullanacağız.

# x ekseni ve y ekseni yönleri. Bunun için piksel değerlerini geçmemiz yeterli.

# Bu programda görüntüyü 30 piksel sağa kaydıracağız

# ve alta doğru 70 piksel.

çeviri_mat = Örneğin. şamandıra32 ( [ [ 1 , 0 , 30 ] , [ 0 , 1 , 70 ] ] )

resim_çevirisi = CV2. warpAffine ( görüntü , çeviri_mat ,

( görüntü. şekil [ 1 ] , görüntü. şekil [ 0 ] ) )

CV2. gösteri ( 'Görüntü çevirisi Aşağı ve Sağ' , resim_çevirisi )

# şimdi, görüntüleri kaydırmak için yukarıdaki NumPy matrisini kullanacağız.

# x ekseni (sol) ve y ekseni (yukarı) yönleri.

# Burada resimleri 50 piksel sola kaydırıyoruz.

# ve yukarıya doğru 90 piksel.

çeviri_mat = Örneğin. şamandıra32 ( [ [ 1 , 0 , - elli ] , [ 0 , 1 , - 90 ] ] )

resim_çevirisi = CV2. warpAffine ( resim , çeviri_mat ,

( görüntü. şekil [ 1 ] , görüntü. şekil [ 0 ] ) )

CV2. gösteri ( 'Görüntü çevirisi Yukarı ve Sol' , resim_çevirisi )

CV2. bekleKey ( 0 )

1'den 5'e kadar olan satırlar: OpenCV, argparser ve NumPy gibi bu program için gerekli tüm paketleri içe aktarıyoruz. Lütfen imutils adlı başka bir kütüphane olduğunu unutmayın. Bu bir OpenCV paketi değildir. Bu, aynı görüntü işlemeyi kolayca gösterecek bir kitaplıktır.



OpenCV'yi kurduğumuzda kitaplık imutils otomatik olarak dahil edilmeyecektir. İmutilleri yüklemek için aşağıdaki yöntemi kullanmalıyız:

imutils'i kurun pip

8'den 15'e kadar olan satırlar: Agparser'ımızı oluşturduk ve imajımızı yükledik.

24'ten 25'e kadar olan satırlar: Bu program bölümü, çevirinin yapıldığı yerdir. Çeviri matrisi, görüntünün kaç piksel yukarı veya aşağı veya sola veya sağa hareket ettirileceğini bize söyler. OpenCV, matris değerinin bir kayan nokta dizisinde olmasını gerektirdiğinden, çeviri matrisi, kayan nokta dizilerindeki değerleri alır.

Öteleme matrisinin ilk satırı şöyle görünür:

Matrisin bu satırı x ekseni içindir. t'nin değeri x görüntünün sola mı yoksa sağa mı kaydırılacağına karar verecektir. Negatif bir değer geçersek görüntü sola, değer pozitif ise görüntü sağ tarafa kayar demektir.

Şimdi matrisin ikinci satırını aşağıdaki gibi tanımlayacağız:

Matrisin bu satırı y ekseni içindir. t'nin değeri Y görüntünün yukarı mı yoksa aşağı mı kaydırılacağına karar verecektir. Negatif bir değer geçersek görüntü yukarı, pozitif ise görüntü aşağı kayacak demektir.

Önceki programda 24. satırda t'yi tanımladık. x = 30 ve t Y = 70. Yani görüntüyü 30 piksel sağ tarafa ve 70 piksel aşağı kaydırıyoruz.

Ancak asıl görüntü çevirme işlemi, çeviri matrisini tanımladığımız 25. satırda gerçekleşir. cv2.warpAffine . Bu fonksiyonda üç parametreyi geçiyoruz: birinci parametre görüntü, ikinci parametre çeviri matrisi ve üçüncü parametre görüntü boyutudur.

Satır 27: Satır 27 çıktıda sonucu gösterecektir.

Şimdi, sol ve üst taraf için başka bir öteleme matrisi uygulayacağız. Bunun için değerleri negatif olarak tanımlamamız gerekiyor.

Satır 33 - 34: Önceki programda 33. satırda t'yi tanımladık. x = -50 ve t Y = -90. Bu yüzden görüntüyü 50 piksel sola ve 90 piksel yukarı kaydırıyoruz. Ancak asıl görüntü çevirme işlemi, çeviri matrisini tanımladığımız 34. satırda gerçekleşir. cv2.warpAffine .

Satır 36 : 36. satır sonucu çıktıda gösterildiği gibi gösterecektir.

Bir önceki kodu çalıştırmak için aşağıda verilen görüntünün yolunu vermemiz gerekiyor.

Çıktı: python translate.py –resim sincap.jpg

Şimdi, aynı görüntü çeviri programını kullanarak uygulayacağız. imutil kütüphane. Bu kitaplığın görüntü işleme için kullanımı çok kolaydır. Bu kütüphanede, hakkında düşünmemize gerek yok. cv2.warpAffine çünkü bu kütüphane bununla ilgilenecek. İmutils kütüphanesini kullanarak bu resim çeviri programını uygulayalım.

Python kodu: Aşağıdaki programın adını şu şekilde tutacağız: translate_imutils.py .

# gerekli paketleri içe aktarın

içe aktarmak dizi olarak Örneğin.

içe aktarmak bağımsız değişken

içe aktarmak imutil

içe aktarmak CV2

# Bu işlev, görüntü çevirisini uygular ve

# çevrilmiş görüntüyü çağıran işleve döndürür.

kesin Çevirmek ( görüntü , x , Y ) :

çeviri_matrisi = Örneğin. şamandıra32 ( [ [ 1 , 0 , x ] , [ 0 , 1 , Y ] ] )

resim_çevirisi = CV2. warpAffine ( görüntü , çeviri_matrisi ,

( görüntü. şekil [ 1 ] , görüntü. şekil [ 0 ] ) )

geri dönmek resim_çevirisi

# bağımsız değişken ayrıştırıcısını oluştur ve bağımsız değişkenleri ayrıştır

ap = arg ayrıştırma ArgümanAyrıştırıcı ( )

ap. add_argument ( '-i' , '--resim' , gereklidir = Doğru , Yardım Edin = 'Resmin yolu' )

argümanlar = kimin ( ap. ayrıştırma_args ( ) )

# görüntüyü yükleyin ve ekranda görüntüleyin

görüntü = CV2. imread ( argümanlar [ 'resim' ] )

CV2. gösteri ( 'Orijinal fotoğraf' , görüntü )

resim_çevirisi = imutil. Çevirmek ( görüntü , 10 , 70 )

CV2. gösteri ( 'Sağa ve aşağı doğru resim çevirisi' ,

resim_çevirisi )

CV2. bekleKey ( 0 )

9'dan 13'e kadar olan satırlar: Programın bu bölümü çevirinin yapıldığı yerdir. Çeviri matrisi, görüntünün kaç piksel yukarı veya aşağı veya sola veya sağa hareket ettirileceğini bize bildirir.

Bu satırlar zaten açıklanmıştır, ancak şimdi translate () adında bir işlev oluşturacağız ve içine üç farklı parametre göndereceğiz. Görüntünün kendisi ilk parametre olarak işlev görür. Öteleme matrisinin x ve y değerleri, ikinci ve üçüncü parametrelere karşılık gelir.

Not : Bu çeviri işlevini program içinde tanımlamanıza gerek yoktur çünkü imutils kitaplığı paketinde zaten bulunmaktadır. Anlaşılır olması açısından program içinde kullandım. Bu işlevi, 24. satırda gösterildiği gibi imutils ile doğrudan çağırabiliriz.

Satır 24: Önceki program 24. satırda tx = 10 ve ty = 70 tanımladığımızı gösterecek. Bu nedenle görüntüyü 10 piksel sağ tarafa ve 70 piksel aşağı doğru hareket ettiriyoruz.

Bu programda herhangi bir cv2.warpAffine fonksiyonuna bakmıyoruz çünkü onlar zaten imutils library paketinin içinde.

Önceki kodu çalıştırmak için, görüntünün yolunu aşağıda verildiği gibi vermeliyiz:

Çıktı:

python imutils. py --resim sincap. jpg

2. Görüntü Döndürme

Önceki derste (veya herhangi bir kombinasyonda) bir görüntüyü yukarı, aşağı, sola ve sağa nasıl çevireceğimizi (yani kaydıracağımızı) inceledik. Ardından, görüntü işlemeyle ilgili olarak döndürmeyi tartışacağız.

Bir resim, döndürme olarak bilinen bir süreçte bir teta açısı kadar döndürülür. Görüntüyü döndürdüğümüz açı teta ile temsil edilecektir. Ek olarak, görüntüleri döndürmeyi daha basit hale getirmek için döndürme kolaylığı işlevini daha sonra sağlayacağım.

Çeviriye benzer şekilde ve belki de şaşırtıcı olmayacak şekilde, bir açıyla döndürme, teta aşağıdaki formatta bir M matrisi oluşturularak belirlenir:

Bu matris, verilen (x, y)-Kartezyen düzlemi etrafında bir vektörü teta dereceleri (saat yönünün tersine) döndürebilir. Normalde, bu senaryoda, başlangıç ​​noktası resmin merkezi olacaktır, ancak gerçekte herhangi bir rastgele (x, y) noktasını dönüş merkezimiz olarak belirleyebiliriz.

Döndürülmüş resim R daha sonra basit matris çarpımı kullanılarak orijinal görüntüden I oluşturulur: R = IM

Öte yandan OpenCV, ek olarak (1) bir görüntüyü ölçeklendirme (yani yeniden boyutlandırma) ve (2) etrafındaki dönüşü gerçekleştirmek için isteğe bağlı bir döndürme merkezi sunma kapasitesi sunar.

Değiştirilmiş döndürme matrisimiz M aşağıda gösterilmiştir:

adlı yeni bir dosyayı açıp oluşturarak başlayalım. döndürme.py :

# gerekli paketleri içe aktarma

içe aktarmak dizi olarak Örneğin.

içe aktarmak bağımsız değişken

içe aktarmak imutil

içe aktarmak CV2

# argumentparser nesnesini oluşturma ve bağımsız değişkeni ayrıştırma

apobj = arg ayrıştırma ArgümanAyrıştırıcı ( )

apobj. add_argument ( '-k' , '--resim' , gereklidir = Doğru , Yardım Edin = 'görüntü yolu' )

argümanlar = kimin ( apobj. ayrıştırma_args ( ) )

görüntü = CV2. imread ( argümanlar [ 'resim' ] )

CV2. gösteri ( 'Orijinal fotoğraf' , görüntü )

# Resmin boyutlarını kullanarak resmin merkezini hesaplayın.

( boy uzunluğu , Genişlik ) = görüntü. şekil [ : 2 ]

( merkezX , merkezY ) = ( Genişlik / 2 , boy uzunluğu / 2 )

# Şimdi cv2 kullanarak görüntüyü 55 derece döndüreceğiz.

# getRotationMatrix2D() kullanarak döndürme matrisini belirleyin

döndürmeMatrisi = CV2. getRotationMatrix2D ( ( merkezX , merkezY ) , 55 , 1.0 )

döndürülmüş Görüntü = CV2. warpAffine ( görüntü , döndürmeMatrisi , ( Genişlik , boy uzunluğu ) )

CV2. gösteri ( 'Görüntüyü 55 Derece döndürdü' , döndürülmüş Görüntü )

CV2. bekleKey ( 0 )

# Görüntü şimdi -85 derece döndürülecek.

döndürmeMatrisi = CV2. getRotationMatrix2D ( ( merkezX , merkezY ) , - 85 , 1.0 )

döndürülmüş Görüntü = CV2. warpAffine ( görüntü , döndürmeMatrisi , ( Genişlik , boy uzunluğu ) )

CV2. gösteri ( 'Görüntü -85 Derece döndürüldü' , döndürülmüş Görüntü )

CV2. bekleKey ( 0 )

1'den 5'e kadar olan satırlar: OpenCV, argparser ve NumPy gibi bu program için gerekli tüm paketleri içe aktarıyoruz. Lütfen imutils adlı başka bir kütüphane olduğunu unutmayın. Bu bir OpenCV paketi değildir. Bu sadece aynı görüntü işlemeyi kolayca göstermek için kullanılacak bir kütüphanedir.

OpenCV'yi kurduğumuzda kitaplık imutils otomatik olarak dahil edilmeyecektir. OpenCV, imutilleri kurar. Aşağıdaki yöntemi kullanmalıyız:

imutils'i kurun pip

8'den 14'e kadar olan satırlar: Agparser'ımızı oluşturduk ve imajımızı yükledik. Bu bağımsız değişken çözümleyicide, dönüşü göstermek için bu programda kullanacağımız görüntünün yolunu bize söyleyecek olan tek bir görüntü argümanı kullanıyoruz.

Bir görüntüyü döndürürken, döndürmenin pivot noktasını tanımlamamız gerekir. Çoğu zaman bir görüntüyü merkezi etrafında döndürmek isteyeceksiniz, ancak OpenCV bunun yerine rastgele herhangi bir nokta seçmenize izin veriyor. Resmi merkezi etrafında döndürelim.

17'den 18'e kadar olan satırlar sırasıyla görüntünün genişliğini ve yüksekliğini alın ve ardından görüntünün merkezini oluşturmak için her bir boyutu ikiye bölün.

Bir görüntüyü çevirmek için bir matris tanımladığımız gibi, bir görüntüyü döndürmek için bir matris oluştururuz. Biz sadece arayacağız cv2.getRotationMatrix2D NumPy kullanarak matrisi manuel olarak oluşturmak yerine (biraz hantal olabilir) Satır 22'de işlev görür.

bu cv2.getRotationMatrix2D işlevi üç parametre gerektirir. İlk girdi istenen dönme açısıdır (bu durumda görüntünün merkezi). Theta daha sonra görüntüyü kaç derece (saat yönünün tersine) döndüreceğimizi belirtmek için kullanılır. Burada görüntüyü 45 derece döndüreceğiz. Son seçenek görüntünün boyutuyla ilgilidir.

Henüz bir görüntüyü ölçeklendirmeyi tartışmamış olmamıza rağmen, burada görüntünün orijinal oranlarında kullanılması gerektiğini belirten 1.0 ile bir kayan noktalı sayı sağlayabilirsiniz. Ancak, 2.0 değerini yazarsanız, görüntünün boyutu iki katına çıkar. 0,5 sayısı görüntünün boyutunu bu şekilde azaltır.

Satır 22 - 23: Dönme matrisimizi M aldıktan sonra cv2.getRotationMatrix2D işlevini kullanarak görüntümüzü döndürüyoruz. cv2.warpAffine Satır 23'teki teknik. Fonksiyonun ilk girişi, döndürmek istediğimiz görüntüdür. Ardından, çıktı görüntümüzün genişliği ve yüksekliği, döndürme matrisimiz M ile birlikte tanımlanır. 23. satırda, görüntü daha sonra 55 derece döndürülür.

Resmimizin döndürüldüğünü fark edebilirsiniz.

28 - 30 arası satırlar ikinci dönüşü oluşturur. Kodun 22–23. satırları aynıdır, ancak bu sefer 55 yerine -85 derece dönüyoruz.

Bu noktaya kadar bir görüntüyü basitçe merkezi etrafında döndürdük. Ya görüntüyü rastgele bir nokta etrafında döndürmek istersek?

adlı yeni bir dosyayı açıp oluşturarak başlayalım. döndürme.py:

# gerekli paketleri içe aktarma

içe aktarmak dizi olarak Örneğin.

içe aktarmak bağımsız değişken

içe aktarmak imutil

içe aktarmak CV2

# argumentparser nesnesini oluşturma ve bağımsız değişkeni ayrıştırma

ap_obj = arg ayrıştırma ArgümanAyrıştırıcı ( )

ap_obj. add_argument ( '-k' , '--resim' , gereklidir = Doğru , Yardım Edin = 'görüntü yolu' )

argüman = kimin ( ap_obj. ayrıştırma_args ( ) )

# görüntüyü yükleyin ve ekranda görüntüleyin

görüntü = CV2. imread ( argüman [ 'resim' ] )

CV2. gösteri ( 'Orijinal fotoğraf' , görüntü )

# Resmin boyutlarını kullanarak resmin merkezini hesaplayın.

( boy uzunluğu , Genişlik ) = görüntü. şekil [ : 2 ]

( merkezX , merkezY ) = ( Genişlik / 2 , boy uzunluğu / 2 )

# Şimdi cv2 kullanarak görüntüyü 55 derece döndüreceğiz.

# getRotationMatrix2D() kullanarak döndürme matrisini belirleyin

döndürmeMatrisi = CV2. getRotationMatrix2D ( ( merkezX , merkezY ) , 55 , 1.0 )

döndürülmüş Görüntü = CV2. warpAffine ( görüntü , döndürmeMatrisi , ( Genişlik , boy uzunluğu ) )

CV2. gösteri ( 'Görüntüyü 55 Derece döndürdü' , döndürülmüş Görüntü )

CV2. bekleKey ( 0 )

# Görüntü şimdi -85 derece döndürülecek.

döndürmeMatrisi = CV2. getRotationMatrix2D ( ( merkezX , merkezY ) , - 85 , 1.0 )

döndürülmüş Görüntü = CV2. warpAffine ( görüntü , döndürmeMatrisi , ( Genişlik , boy uzunluğu ) )

CV2. gösteri ( 'Görüntü -85 Derece döndürüldü' , döndürülmüş Görüntü )

CV2. bekleKey ( 0 )

# merkezden değil, herhangi bir noktadan görüntü döndürme

döndürmeMatrisi = CV2. getRotationMatrix2D ( ( merkezX - 40 , merkezY - 40 ) , 55 , 1.0 )

döndürülmüş Görüntü = CV2. warpAffine ( görüntü , döndürmeMatrisi , ( Genişlik , boy uzunluğu ) )

CV2. gösteri ( 'İsteğe bağlı noktalardan görüntü döndürme' , döndürülmüş Görüntü )

CV2. bekleKey ( 0 )

Satır 34 - 35: Şimdi, bu kod bir nesneyi döndürmek için oldukça yaygın görünmelidir. Görüntüyü 40 piksel sola ve merkezinin 40 piksel yukarısına döndürmek için, cv2.getRotationMatrix2D ilk parametresine dikkat etme işlevi.

Bu döndürmeyi uyguladığımızda oluşan görüntü aşağıda gösterilmiştir:

Döndürme merkezinin artık (x, y)-koordinatı olduğunu açıkça görebiliriz, bu da resmin hesaplanan merkezinin 40 piksel solunda ve 40 piksel yukarısındadır.

3. Görüntü Aritmetiği

Aslında, görüntü aritmetiği, daha sonra ele alacağımız veri türleri üzerinde birkaç ek kısıtlama ile sadece matris toplamadır.

Doğrusal cebirin bazı güzel temellerini gözden geçirmek için biraz zaman ayıralım.

Sonraki iki matrisi birleştirmeyi düşünün:

Matris toplama hangi sonucu verir? Basit cevap, matris girdilerinin eleman eleman toplamıdır:

Yeterince basit, değil mi?

Hepimiz şu anda toplama ve çıkarmanın temel işlemlerini anlıyoruz. Ancak görsellerle çalışırken renk uzayımızın ve veri tipimizin getirdiği kısıtlamalara dikkat etmeliyiz.

Örneğin, RGB görüntülerdeki pikseller [0, 255] arasındadır. 250 yoğunluğundaki bir piksele bakarken ona 10 eklemeye çalışırsak ne olur?

Standart aritmetik ilkeleri uygularsak 260 değerine ulaşırız. RGB görüntüleri 8 bitlik işaretsiz tamsayılar olarak temsil edildiğinden, 260 geçerli bir değer değildir.

Peki ne olması gerekiyor? Hiçbir pikselin [0, 255] aralığının ötesinde olmadığından emin olmak için her pikseli 0 ile 255 arasında bir değere sahip olacak şekilde kırparak bir kontrol yapmalı mıyız?

Yoksa 'sarılır' ve bir modül işlemi mi gerçekleştiririz? Katsayı kurallarına göre, 255'e 10 eklemek sadece 9 değerini verir.

[0, 255] aralığının ötesinde görüntülere yapılan eklemeler ve çıkarmalar nasıl ele alınmalıdır?

Gerçek şu ki, doğru ya da yanlış teknik yoktur; her şey piksellerinizle nasıl çalıştığınıza ve neyi başarmayı umduğunuza bağlıdır.

Ancak OpenCV'deki toplama ile NumPy'deki toplama arasında farklılıklar olduğunu unutmayın. Modül aritmetiği ve “sarma” NumPy tarafından yapılacaktır. Aksine, OpenCV kırpmayı yürütür ve piksel değerlerinin [0, 255] aralığından asla çıkmamasını sağlar.

adlı yeni bir dosya oluşturarak başlayalım. aritmetik.py ve açarak:

# python aritmetik.py --resim squirrel.jpg

# gerekli paketleri içe aktarma

içe aktarmak dizi olarak Örneğin.

içe aktarmak bağımsız değişken

içe aktarmak imutil

içe aktarmak CV2

# argumentparser nesnesini oluşturma ve bağımsız değişkeni ayrıştırma

apObj = arg ayrıştırma ArgümanAyrıştırıcı ( )

apObj. add_argument ( '-k' , '--resim' , gereklidir = Doğru , Yardım Edin = 'görüntü yolu' )

argümanlar = kimin ( apObj. ayrıştırma_args ( ) )

görüntü = CV2. imread ( argümanlar [ 'resim' ] )

CV2. gösteri ( 'Orijinal fotoğraf' , görüntü )

'''

Piksellerimizin değerleri [0, 255] aralığında olacaktır.

çünkü görüntüler, işaretsiz 8 bitlik tamsayılar olarak depolanan NumPy dizileridir.

cv2.add ve cv2.subtract gibi işlevleri kullanırken değerler kırpılır

dışından eklenseler veya çıkarılsalar bile bu aralığa

[0, 255] aralığı. İşte bir örnek:

'''


Yazdır ( 'maksimum 255: {}' . biçim ( str ( CV2. Ekle ( Örneğin. uint8 ( [ 201 ] ) ,

Örneğin. uint8 ( [ 100 ] ) ) ) ) )

Yazdır ( 'minimum 0: {}' . biçim ( str ( CV2. çıkarmak ( Örneğin. uint8 ( [ 60 ] ) ,

Örneğin. uint8 ( [ 100 ] ) ) ) ) )

'''

NumPy kullanarak bu dizilerle aritmetik işlemler yaparken,

değer kırpılmak yerine etrafı sarar

[0, 255]aralık. Görüntüleri kullanırken, bunu korumak çok önemlidir.

akılda.

'''


Yazdır ( 'etrafına sarmak: {}' . biçim ( str ( Örneğin. uint8 ( [ 201 ] ) + örn. uint8 ( [ 100 ] ) ) ) )

Yazdır ( 'etrafına sarmak: {}' . biçim ( str ( Örneğin. uint8 ( [ 60 ] ) - Örneğin. uint8 ( [ 100 ] ) ) ) )

'''

Görüntümüzdeki her pikselin parlaklığını 101 ile çarpalım.

Bunu yapmak için, matrisimizle aynı boyutta bir NumPy dizisi oluşturuyoruz,

birlerle dolu ve dolu bir dizi oluşturmak için 101 ile çarpın

101'ler ile. Son olarak iki resmi birleştiriyoruz.

Görüntünün artık 'daha parlak' olduğunu fark edeceksiniz.

'''


Matris = Örneğin. olanlar ( görüntü. şekil , d tipi = 'uint8' ) * 101

resim_eklendi = CV2. Ekle ( görüntü , Matris )

CV2. gösteri ( 'Görüntü Sonucu Eklendi' , resim_eklendi )

#Benzer şekilde fotoğraf çekerek görüntümüzü daha koyu hale getirebiliriz.

Tüm piksellerden # 60 uzakta.

Matris = Örneğin. olanlar ( görüntü. şekil , d tipi = 'uint8' ) * 60

resim_çıkarılmış = CV2. çıkarmak ( görüntü , Matris )

CV2. gösteri ( 'Çıkarılmış Görüntü Sonucu' , resim_çıkarılmış )

CV2. bekleKey ( 0 )

1'den 16'ya kadar olan satırlar paketlerimizi içe aktarmayı, argüman ayrıştırıcımızı yapılandırmayı ve imajımızı yüklemeyi içeren normal sürecimizi gerçekleştirmek için kullanılacaktır.

Daha önce OpenCV ve NumPy eklemesi arasındaki farkı nasıl tartıştığımı hatırlıyor musunuz? Artık iyice ele aldığımıza göre, onu anladığımızdan emin olmak için belirli bir duruma bakalım.

İki adet 8 bitlik işaretsiz tamsayı NumPy dizisi şu şekilde tanımlanır: satır 26 . 201 değeri, ilk dizideki tek öğedir. İkinci dizide yalnızca bir üye olmasına rağmen, 100 değerine sahiptir. Değerler daha sonra OpenCV'nin cv2.add işlevi kullanılarak eklenir.

Sonucun ne olacağını tahmin ediyorsunuz?

Geleneksel aritmetik ilkelerine göre cevap 301 olmalıdır. Ancak, yalnızca [0, 255] aralığında olabilen 8 bitlik işaretsiz tamsayılarla uğraştığımızı unutmayın. cv2.add yöntemini kullandığımız için, OpenCV kırpmayı işler ve eklemenin yalnızca maksimum 255 sonuç döndürmesini sağlar.

Aşağıdaki listenin ilk satırı bu kodu çalıştırmanın sonucunu gösterir:

aritmetik. py

maksimum 255 : [ [ 255 ] ]

Toplam gerçekten de 255 sayısını üretti.

Bunu takiben, satır 26 bir çıkarma gerçekleştirmek için cv2.subtract kullanır. Bir kez daha, her birinde tek bir öğe bulunan iki adet 8 bitlik işaretsiz tamsayı NumPy dizisi tanımlıyoruz. Birinci dizinin değeri 60, ikinci dizinin değeri ise 100'dür.

Aritmetiğimiz, çıkarma işleminin -40 değeriyle sonuçlanması gerektiğini belirtir, ancak OpenCV, kırpmayı bizim için bir kez daha halleder. Değerin 0'a kırpıldığını keşfediyoruz. Aşağıdaki sonucumuz bunu gösteriyor:

aritmetik. py

minimum 0 : [ [ 0 ] ]

cv2'yi kullanarak, 60'tan 100'ü çıkarın ve 0 değerini üretin.

Ancak hesaplamaları yapmak için OpenCV yerine NumPy kullanırsak ne olur?

Satır 38 ve 39 bu işi tarif et.

İlk olarak, her biri tek bir elemana sahip iki adet 8 bitlik işaretsiz tamsayı NumPy dizisi tanımlanır. İlk dizinin değeri 201, ikinci dizinin değeri ise 100'dür. cv2.add işlevini kullanırsak eklememiz kırpılır ve 255 değeri döndürülür.

Öte yandan NumPy, 'sarar' ve kırpma yerine modulo aritmetiği yapar. NumPy, 255 değerine ulaşıldığında sıfıra döner ve ardından 100 adıma ulaşılana kadar saymaya devam eder. Bu, aşağıda gösterilen ilk çıktı satırı tarafından onaylanır:

aritmetik. py
etrafına sarmak: [ Dört beş ]

Ardından, biri 50, diğeri 100 olan iki NumPy dizisi daha tanımlanır. Bu çıkarma, cv2.subtract yöntemiyle 0 sonucunu döndürecek şekilde kırpılır. Ancak, NumPy'nin kırpmak yerine yürüttüğünün farkındayız. modulo aritmetiği. Bunun yerine, modulo prosedürleri etrafı sarar ve çıkarma sırasında 0'a ulaşıldığında 255'ten geriye doğru saymaya başlar. Bunu aşağıdaki çıktıdan görebiliriz:

aritmetik. py

etrafına sarmak: [ 207 ]

Terminal çıktımız bir kez daha kırpma ve sarma arasındaki farkı gösteriyor:

Tamsayı aritmetiği yaparken istediğiniz sonucu aklınızda tutmanız çok önemlidir. [0, 255] aralığının dışındaki değerlerin kırpılmasını istiyor musunuz? Bundan sonra OpenCV'nin yerleşik görüntü aritmetiği tekniklerini kullanın.

[0, 255] ve modül aritmetik işlemleri aralığının dışındaysa, değerlerin etrafı sarmasını ister misiniz? NumPy dizileri daha sonra her zamanki gibi basitçe eklenir ve çıkarılır.

Satır 48 görüntümüzle aynı boyutlara sahip tek boyutlu bir NumPy dizisi tanımlar. Bir kez daha veri tipimizin 8 bit işaretsiz tamsayı olduğundan emin oluyoruz. 1 yerine 101 değerleri ile doldurmak için tek basamaklı değerler matrisimizi 101 ile çarpıyoruz. Son olarak, 100'ler matrisimizi orijinal görüntüye eklemek için cv2.add işlevini kullanıyoruz. Bu, her pikselin yoğunluğunu 101 artırırken aynı zamanda 255'i aşmaya çalışan tüm değerlerin [0, 255] aralığına kırpılmasını sağlar.

Görüntünün orijinalinden nasıl belirgin şekilde daha parlak olduğunu ve daha “soluk” göründüğünü gözlemleyin. Bunun nedeni, piksel yoğunluklarını 101 artırarak pikselleri daha parlak renklere doğru yönlendirmemizdir.

Görüntünün her bir piksel yoğunluğundan 60 çıkarmak için önce 54. satırda 60'larla dolu ikinci bir NumPy dizisi oluşturuyoruz.

Bu çıkarma işleminin sonuçları aşağıdaki resimde gösterilmektedir:

Çevremizdeki nesneler, daha önce olduğundan çok daha koyu görünür. Bunun nedeni, her pikselden 60 çıkararak RGB renk uzayındaki pikselleri daha koyu bölgelere taşımamızdır.

4. Görüntü Çevirme

Döndürmeye benzer şekilde, bir görüntüyü x veya y ekseni boyunca çevirmek, OpenCV tarafından sunulan başka bir seçenektir. Döndürme işlemleri o kadar sık ​​kullanılmasa bile, bunları bilmek, hemen göremeyebileceğiniz çeşitli nedenlerle inanılmaz derecede faydalıdır.

Görüntülerdeki yüzleri tanımlamayı amaçlayan küçük bir başlangıç ​​şirketi için bir makine öğrenimi sınıflandırıcısı geliştiriyoruz. Sistemimizin bir yüzün ne olduğunu 'öğrenmesi' için örnek yüzler içeren bir tür veri kümesine ihtiyacımız olacaktır. Ne yazık ki, şirket bize yalnızca 40 yüz içeren küçük bir veri seti verdi ve daha fazla bilgi toplayamıyoruz.

Öyleyse ne yapacağız?

Bir yüz, aynalanmış olsun ya da olmasın bir yüz olarak kaldığından, bir yüzün her bir görüntüsünü yatay olarak çevirebilir ve aynalanmış versiyonları ekstra eğitim verisi olarak kullanabiliriz.

Bu örnek aptalca ve yapay görünebilir ama değil. Çevirme, eğitim aşamasında daha fazla veri üretmek için güçlü derin öğrenme algoritmaları tarafından kullanılan kasıtlı bir stratejidir.

Bu modülde öğrendiğiniz görüntü işleme yöntemlerinin daha büyük bilgisayarlı görü sistemleri için temel işlevi gördüğü öncekinden açıktır.

hedefler:

Kullanmak cv2.flip işlevi, bu oturumda bir görüntüyü hem yatay hem de dikey olarak nasıl çevireceğinizi öğreneceksiniz.

Döndürme, inceleyeceğimiz bir sonraki görüntü manipülasyonudur. Bir görüntünün x ve y eksenleri ters çevrilebilir, hatta her ikisi de çevrilebilir. Kodlamaya dalmadan önce, bir görüntü çevirmenin sonuçlarına bakmak en iyisidir. Aşağıdaki resimde yatay olarak çevrilmiş bir resme bakın:


Orijinal görüntümüzün solda nasıl olduğuna ve görüntünün sağda yatay olarak nasıl yansıtıldığına dikkat edin.

adlı yeni bir dosya oluşturarak başlayalım. saygısız.py .

Bir görüntü çevirme örneğini gördünüz, o halde kodu inceleyelim:

# python flipping.py --image quirrel.jpg

# gerekli paketleri içe aktarma

içe aktarmak bağımsız değişken

içe aktarmak CV2

# bağımsız değişken ayrıştırıcısının nesnesini oluşturma ve bağımsız değişkeni ayrıştırma

apObj = arg ayrıştırma ArgümanAyrıştırıcı ( )

apObj. add_argument ( '-i' , '--resim' , gereklidir = Doğru , Yardım Edin = 'görüntü yolu' )

argüman = kimin ( apObj. ayrıştırma_args ( ) )

görüntü = CV2. imread ( argüman [ 'resim' ] )

CV2. gösteri ( 'orijinal' , görüntü )

# görüntüyü yatay olarak çevir

görüntü çevrilmiş = CV2. çevir ( görüntü , 1 )

CV2. gösteri ( 'Görüntüyü Yatay Olarak Döndürdü' , görüntü çevrilmiş )

# görüntüyü dikey olarak çevir

görüntü çevrilmiş = CV2. çevir ( görüntü , 0 )

CV2. gösteri ( 'Görüntüyü Dikey Olarak Ters Çevirdim' , görüntü çevrilmiş )

# her iki eksen boyunca görüntü çevirme

görüntü çevrilmiş = CV2. çevir ( görüntü , - 1 )

CV2. gösteri ( 'Yatay ve Dikey Olarak Çevrildi' , görüntü çevrilmiş )

CV2. bekleKey ( 0 )

Paketlerimizi içe aktarmak, girdilerimizi ayrıştırmak ve imajımızı diskten yüklemek için attığımız adımlar l'de işlenir. ines 1 ila 12 .

üzerinde cv2.flip işlevini çağırarak Satır 15 , bir görüntüyü yatay olarak çevirmek kolaydır. Döndürmeye çalıştığımız görüntü ve görüntünün nasıl çevrileceğini belirten belirli bir kod veya işaret, cv2.flip yöntemi için gereken iki argümandır.

1 çevirme kodu değeri, görüntüyü yatay olarak çevirmek için y ekseni etrafında döndüreceğimiz anlamına gelir ( Satır 15 ). 0 çevirme kodu belirtirsek, görüntüyü x ekseni etrafında döndürmek isteriz ( Satır 19 ). Negatif çevirme kodu ( Satır 23 ) görüntüyü her iki eksende döndürür.

Bu konudaki en kolay örneklerden biri, temel olan bir görüntüyü çevirmek.

Ardından, görüntüleri kırpmayı tartışacağız ve belirli görüntü bölümlerini çıkarmak için NumPy dizi dilimlerini kullanacağız.

5. Görüntü Kırpma

Kırpma, adından da anlaşılacağı gibi, görüntünün bizi ilgilendiren alanı olan İlgi Alanını (veya kısaca ROI) seçme ve kaldırma işlemidir.

Bir yüz algılama uygulaması için yüzün bir görüntüden kırpılması gerekir. Ek olarak, görüntülerde köpekleri bulmak için bir Python betiği oluşturuyorsak, köpeği bulduğumuzda görüntüden kırpmak isteyebiliriz.

Hedefler: Ana hedefimiz, bir görüntüden alanları kırpmak için NumPy dizi dilimlemeyi kullanmaya alışmak ve bunları kolayca kullanmaktır.

Kırpma : Bir görüntüyü kırptığımızda amacımız, bizi ilgilendirmeyen dış unsurları ortadan kaldırmaktır. Yatırım Getirimizi seçme süreci genellikle ilgilendiğimiz bölgeyi seçme olarak adlandırılır.

adlı yeni bir dosya oluşturun. kırpma.py , açın ve aşağıdaki kodu ekleyin:

# piton kırpma.py

# gerekli paketleri içe aktarma

içe aktarmak CV2

# görüntü yükleme ve ekranda görüntüleme

görüntü = CV2. imread ( 'sincap.jpg' )

Yazdır ( görüntü. şekil )

CV2. gösteri ( 'orijinal' , görüntü )

# NumPy dizi dilimleri, bir görüntüyü hızla kırpmak için kullanılır

# sincap yüzünü görüntüden kırpacağız

sincap suratlı = görüntü [ 35 : 90 , 35 : 100 ]

CV2. gösteri ( 'sincap Yüz' , sincap suratlı )

CV2. bekleKey ( 0 )

# Ve şimdi, burada tüm vücudu kırpacağız

# sincap

sincap gövdesi = görüntü [ 35 : 148 , 23 : 143 ]

CV2. gösteri ( 'Sincap Gövdesi' , sincap gövdesi )

CV2. bekleKey ( 0 )

Diskten yüklediğimiz bir görüntüyü kullanarak Python ve OpenCV'de kırpmayı göstereceğiz. 5. ve 6. satırlar .

Kırpacağımız orijinal resim

Yalnızca temel kırpma tekniklerini kullanarak, sincap yüzünü ve sincap gövdesini çevredeki alandan ayırmayı amaçlıyoruz.

Görüntüyle ilgili önceki bilgilerimizi kullanacağız ve vücudun ve yüzün bulunduğu yerin NumPy dizisi dilimlerini manuel olarak sağlayacağız. Normal şartlar altında, görüntüdeki yüzü ve vücudu tanımak için genellikle makine öğrenimi ve bilgisayarla görme algoritmalarını kullanırdık. Ancak şimdilik işleri basit tutalım ve herhangi bir algılama modeli kullanmaktan kaçınalım.

Resimdeki yüzü tek bir kod satırı ile tanımlayabiliriz. Satır 13 , Görüntünün (35, 35)'ten başlayarak bir dikdörtgen bölümünü çıkarmak için NumPy dizi dilimleri (90, 100) sağlıyoruz. Kırpmayı, yaptığımız gibi yükseklik-birinci ve genişlik-ikinci sıradaki dizinlerle beslememiz kafa karıştırıcı görünebilir, ancak OpenCV'nin görüntüleri NumPy dizileri olarak sakladığını unutmayın. Sonuç olarak, y ekseni için değerleri x ekseninden önce sağlamalıyız.

NumPy, kırpma işlemimizi gerçekleştirmek için aşağıdaki dört dizini gerektirir:

Başlangıç y: Başlangıçtaki y koordinatı. Bu örnek için y=35'ten başlıyoruz.

Son y: Bitişteki y koordinatı. y = 90 olduğunda mahsulümüz duracak.

Başlat x: Dilimin başlangıç ​​x koordinatı. Hasat x=35'te başlar.

Son x: Dilimin bitiş x ekseni koordinatı. x=100'de dilimimiz bitiyor.

Benzer şekilde, orijinal görüntüden (23, 35) ve (143, 148) bölgelerini kırparak tüm gövdeyi görüntüden çıkarırız. Satır 19 .

Görüntünün yalnızca vücudu ve yüzü gösterecek şekilde kırpıldığını gözlemleyebilirsiniz.

6. Görüntüyü Yeniden Boyutlandırma

Bir görüntünün genişliğini ve yüksekliğini artırma veya azaltma işlemi, ölçekleme veya basitçe yeniden boyutlandırma olarak bilinir. Bir görüntünün genişliğinin yüksekliğine oranı olan en boy oranı, bir görüntüyü yeniden boyutlandırırken dikkate alınmalıdır. En boy oranının ihmal edilmesi, ölçeklenmiş görüntülerin sıkıştırılmış ve bozuk görünmesine neden olabilir:

İlk görselimiz solda. Sağda, en boy oranı korunmadan ölçeklenmiş, görüntünün genişliğinin yüksekliğine oranını bozan iki görüntü göreceksiniz. Resimlerinizi yeniden boyutlandırırken, genellikle en boy oranını göz önünde bulundurmalısınız.

Yeniden boyutlandırma algoritmamız tarafından kullanılan enterpolasyon tekniği, görüntünün boyutunu artırmak veya azaltmak için bu piksel komşuluklarını kullanmak için enterpolasyon işlevinin amacını da dikkate almalıdır.

Genel olarak, görüntünün boyutunu küçültmek çok daha etkilidir. Bunun nedeni, enterpolasyon işlevinin yapması gereken tek şeyin bir görüntüden pikselleri kaldırmak olmasıdır. Öte yandan, görüntü boyutu artırılacaksa enterpolasyon yönteminin pikseller arasındaki daha önce var olmayan 'boşlukları doldurması' gerekecektir.

Solda orijinal görüntümüz var. Görüntü merkezde orijinal boyutunun yarısına küçültülmüş ancak bunun dışında görüntünün “kalitesinde” herhangi bir kayıp yaşanmamış. Bununla birlikte, görüntünün boyutu sağda önemli ölçüde geliştirilmiştir. Artık 'şişmiş' ve 'piksellenmiş' görünüyor.

Daha önce belirttiğim gibi, genellikle bir görüntünün boyutunu büyütmek yerine küçültmek isteyeceksiniz. Görüntü boyutunu küçülterek daha az pikseli analiz ediyoruz ve daha az 'gürültü' ile uğraşmak zorunda kalıyoruz, bu da görüntü işleme algoritmalarını daha hızlı ve daha hassas hale getiriyor.

Öteleme ve döndürme, şu ana kadar ele alınan iki görüntü dönüşümüdür. Şimdi bir resmin nasıl yeniden boyutlandırılacağını inceleyeceğiz.

Şaşırtıcı olmayan bir şekilde, cv2.resize yöntemini kullanarak resimlerimizi yeniden boyutlandıracağız. Daha önce de belirttiğim gibi, bu yöntemi kullanırken görüntünün en boy oranını dikkate almalıyız. Ancak ayrıntılara çok derinlemesine girmeden önce size bir örnek vermeme izin verin:

# python resize.py --image squirrel.jpg

# gerekli paketleri içe aktarma

içe aktarmak bağımsız değişken

içe aktarmak CV2

# bağımsız değişken ayrıştırıcısının nesnesini oluşturma ve bağımsız değişkeni ayrıştırma

apObj = arg ayrıştırma ArgümanAyrıştırıcı ( )

apObj. add_argument ( '-k' , '--resim' , gereklidir = Doğru , Yardım Edin = 'görüntü yolu' )

argümanlar = kimin ( apObj. ayrıştırma_args ( ) )

# görüntüyü yükleyin ve ekranda görüntüleyin

görüntü = CV2. imread ( argümanlar [ 'resim' ] )

CV2. gösteri ( 'orijinal' , görüntü )

# Görüntünün çarpık görünmesini önlemek için en boy oranı

# dikkate alınmalı veya deforme edilmelidir; bu nedenle, ne olduğunu anlıyoruz

# yeni görüntünün mevcut görüntüye oranı.

# Yeni resmimizin genişliğini 160 piksel yapalım.

Görünüş = 160.0 / resim. şekil [ 1 ]

boyut = ( 160 , int ( görüntü. şekil [ 0 ] * Görünüş ) )

# bu satır gerçek yeniden boyutlandırma işlemlerini gösterecek

yeniden boyutlandırılmış görüntü = CV2. yeniden boyutlandırmak ( görüntü , boyut , interpolasyon = CV2. INTER_AREA )

CV2. gösteri ( 'Görüntü genişliğini yeniden boyutlandır' , yeniden boyutlandırılmış görüntü )

# Görüntünün yüksekliğini değiştirmek istesek ne olur? - kullanmak

# aynı prensip, en boy oranını temel alarak hesaplayabiliriz

# genişlikten ziyade yükseklikte. Ölçekli yapalım

# görüntünün yüksekliği 70 piksel.

Görünüş = 70.0 / resim. şekil [ 0 ]

boyut = ( int ( görüntü. şekil [ 1 ] * Görünüş ) , 70 )

# yeniden boyutlandırmayı gerçekleştir

yeniden boyutlandırılmış görüntü = CV2. yeniden boyutlandırmak ( görüntü , boyut , interpolasyon = CV2. INTER_AREA )

CV2. gösteri ( 'Görüntünün yüksekliğini yeniden boyutlandır' , yeniden boyutlandırılmış görüntü )

CV2. bekleKey ( 0 )

Satır 1-14 , Paketlerimizi içe aktardıktan ve argüman çözümleyicimizi yapılandırdıktan sonra, imajımızı yükleyip göstereceğiz.

20. ve 21. Satır: İlgili kodlama bu satırlarda başlamaktadır. . Yeniden boyutlandırma yapılırken görüntünün en boy oranı dikkate alınmalıdır. Görüntünün genişliği ve yüksekliği arasındaki oran, en boy oranı olarak bilinir.

Yükseklik genişlik en boy oranıdır.

En boy oranını dikkate almazsak, yeniden boyutlandırmamızın sonuçları bozulur.

Açık Satır 20 , yeniden boyutlandırma oranı hesaplaması yapılır. Bu kod satırında yeni görselimizin genişliğini 160 piksel olarak veriyoruz. Yeni yüksekliğin eski yüksekliğe oranını hesaplamak için oranımızı (aspectratio) yeni genişliğin (160 piksel) eski genişliğe bölünmesiyle tanımlıyoruz. şekil[1].

Resmin yeni boyutları Satır 21 artık oranımızı bildiğimize göre hesaplayabiliriz. Bir kez daha, yeni görüntünün genişliği 160 piksel olacaktır. Eski boy ile oranımız çarpılıp sonuç tamsayıya çevrildikten sonra boy hesaplanır. Bu işlemi gerçekleştirerek görüntünün orijinal en boy oranını koruyabiliriz.

Satır 24 görüntünün gerçekten yeniden boyutlandırıldığı yerdir. Yeniden boyutlandırmak istediğimiz görüntü birinci argüman, ikincisi ise yeni görüntü için hesapladığımız boyutlardır. Gerçek görüntüyü yeniden boyutlandırma algoritması olan enterpolasyon yöntemimiz son parametredir.

Sonunda, üzerinde Satır 25 , ölçekli resmimizi gösteriyoruz.

Oranımızı (aspectratio) yeniden tanımlıyoruz. Satır 31 . Yeni görselimizin yüksekliği 70 piksel olacak. Yeni boy-orijinal yükseklik oranını elde etmek için 70'i orijinal yüksekliğe böleriz.

Ardından, yeni görüntünün boyutlarını belirliyoruz. Yeni görsel zaten bilinen 70 piksel yüksekliğe sahip olacak. Yeni genişliği oluşturmak için eski genişliği oranla çarparak görüntünün orijinal en boy oranını bir kez daha koruyabiliriz.

Görüntü daha sonra gerçekte yeniden boyutlandırılır Satır 35 ve üzerinde görüntülenir Satır 36.

Burada, en boy oranını korurken orijinal görüntümüzün genişliğini ve yüksekliğini azalttığımızı görebiliriz. En boy oranı korunmasaydı görüntümüz bozuk görünürdü.

Çözüm

Bu blogda, temel farklı görüntü işleme kavramlarını inceledik. OpenCV paketinin yardımıyla resim çevirisini gördük. Görüntüyü yukarı, aşağı, sağa ve sola hareket ettirme yöntemlerini gördük. Bu yöntemler, eğitim veri seti olarak vermek üzere benzer görüntülerden oluşan bir veri seti oluşturduğumuzda çok kullanışlıdır, böylece makine aynı olsalar bile farklı görüntüleri görecektir. Bu makale ayrıca, bir döndürme matrisi kullanarak Kartezyen uzayda herhangi bir nokta etrafında bir görüntüyü nasıl döndüreceğinizi de öğretti. Sonra OpenCV'nin bu matrisi kullanarak görüntüleri nasıl döndürdüğünü keşfettiniz ve dönen görüntülerin birkaç resmini gördünüz.

Toplama ve çıkarmanın iki temel (ama anlamlı) görüntü aritmetik işlemi bu bölümde incelenmiştir. Gördüğünüz gibi, temel matrisleri toplamak ve çıkarmak, tüm görüntü aritmetik işlemlerini gerektirir.

Ek olarak, görüntü aritmetiğinin özelliklerini araştırmak için OpenCV ve NumPy kullandık. Bu kısıtlamalar akılda tutulmalıdır, aksi halde görüntüleriniz üzerinde aritmetik işlemler gerçekleştirirken beklenmedik sonuçlar alma riskiniz vardır.

NumPy'nin bir modül işlemi gerçekleştirmesine ve 'etrafını sarmasına' rağmen, OpenCV toplama ve çıkarma değerlerinin aralığın içine sığması için [0, 255] aralığının ötesinde kesildiğini hatırlamak önemlidir. Kendi bilgisayarla görme uygulamalarınızı geliştirirken, bunu hatırlamak, zor hataların peşine düşmekten kaçınmanıza yardımcı olacaktır.

Görüntüyü çevirmek şüphesiz bu kursta keşfedeceğimiz en basit fikirlerden biridir. Döndürme, daha fazla eğitim verisi örneği oluşturmak için makine öğreniminde sıklıkla kullanılır ve bu da daha güçlü ve güvenilir görüntü sınıflandırıcılarla sonuçlanır.

Bir görüntüyü yeniden boyutlandırmak için OpenCV'yi nasıl kullanacağımızı da öğrendik. Birini yeniden boyutlandırırken, sonucun bozuk görünmemesi için hem kullandığınız enterpolasyon yöntemini hem de orijinal görüntünüzün en boy oranını göz önünde bulundurmak çok önemlidir.

Son olarak, görüntü kalitesi bir sorunsa, daha büyük bir görüntüden daha küçük bir görüntüye geçmenin her zaman en iyisi olduğunu unutmamak çok önemlidir. Çoğu durumda, bir görüntünün büyütülmesi eserler oluşturur ve kalitesini düşürür.