- 1. Görüntü Dönüşümleri - Afin ve Afin Olmayan Dönüşüm
- 2. Görüntü Çevirileri - Görüntüyü yukarı, aşağı, sola ve sağa taşıma
- 3. Görüntünün döndürülmesi - Görüntünün döndürülmesi
- 4. Ölçekleme, Yeniden Boyutlandırma ve Enterpolasyon
- 5. Görüntü Piramitleri - Yeniden boyutlandırmanın başka bir yolu
- 6. Kırpma - İstediğiniz görüntü bölgesini kesip çıkarın
- 7. Görüntülerin Aydınlatılması ve Karartılması için aritmetik işlemler
Bir önceki eğitimde, OpenCV öğrendik ve As bir önceki derste anlattı vb gri ölçekleme, renk doygunluğu, histogram, renk alanlarının, RGB bileşen gibi kullanmaktan işlem bazı temel görüntü yapmış, OpenCV Açık Kaynak Banliyö Vizyon Kütüphanesi vardır C ++, Python ve Java arayüzleri ve Windows, Linux, Mac OS, iOS ve Android'i destekler. Böylece Python ve Linux ortamı ile Raspberry Pi'ye kolaylıkla kurulabilir. Ve OpenCV ve ekli kameralı Raspberry Pi, Yüz algılama, yüz kilidi, nesne izleme, araç plaka algılama, Ev güvenlik sistemi vb. Gibi birçok gerçek zamanlı görüntü işleme uygulaması oluşturmak için kullanılabilir.
Bu eğitimde, OpenCV kullanarak görüntüyü nasıl değiştireceğimizi göreceğiz. Burada, OpenCV kullanarak bir görüntüye aşağıdaki işlevi uygulamayı öğreneceğiz:
- Görüntü Dönüşümleri - Afin ve Afin Olmayan Dönüşüm
- Görüntü Çevirileri - Görüntüyü yukarı, aşağı, sola ve sağa taşıma
- Görüntünün döndürülmesi - Görüntünün döndürülmesi
- Ölçekleme, Yeniden Boyutlandırma ve Enterpolasyon
- Görüntü Piramitleri - Yeniden boyutlandırmanın başka bir yolu
- Kırpma - İstediğiniz görüntü bölgesini kesip çıkarın
- Görüntülerin Aydınlatılması ve Karartılması için aritmetik işlemler
1. Görüntü Dönüşümleri - Afin ve Afin Olmayan Dönüşüm
Dönüşümler, bir görüntünün üzerine uygulanan geometrik çarpıtmalardır, burada bozulmalar kesinlikle hata anlamına gelmez, görüntünün yakalandığı noktadan kaynaklanan perspektif sorunlarını düzeltmek için bir düzeltme türüdür. İki tür görüntü dönüşümü vardır - Afin ve Afin olmayan
Afin dönüşümler üç tip ölçekleme, döndürme ve çevirmedir, afin dönüşümlerde önemli olan şey, görüntü dönüşümlerinden önce ve sonra çizgilerin paralel olmasıdır.
Afin olmayan dönüşümler veya yansıtmalı dönüşümler paralelliği, uzunluğu veya açıyı korumaz, ancak aynı çizgiyi ve gelişmeyi korur, doğrudoğrusallık iki noktanın aynı düz çizgi üzerinde olduğu anlamına gelir.
Afin olmayan dönüşümler bilgisayar görüşünde çok yaygındır ve farklı kamera açılarından üretilir. Afin olmayan veya yansıtmalı dönüşümlere homografi de denir.
2. Görüntü Çevirileri - Görüntüyü yukarı, aşağı, sola ve sağa taşıma
Aynı anda x ve y çevirisini uygularsak, görüntü çevirisi görüntüyü yukarı, aşağı, sola ve sağa ve hatta çapraz hareket ettirir.
Şimdi resim çevirileri yapmak için opencv'nin warpAffine işlevini kullanıyoruz, cv2.warpAffine bu çevirileri uygulamak için kullanılıyor, ancak bunun için bir çeviri matrisine ihtiyacımız var.
Çeviri matrisi, T = 1 0 Tx
0 1 ty
T X, T y, görüntünün kaydığı yönlerdir.
T X, X ekseni boyunca kaymadır (Yatay)
T Y, Y ekseni boyunca kaymadır (Dikey)
# bu, basitçe bir görüntünün konumunu değiştiren afin bir dönüşümdür # bu dönüşümleri uygulamak için cv2.warpAffine kullanıyoruz. cv2 içe aktar np image = cv2.imread ('input.jpg') olarak içe aktar # görüntü yüksekliğinin yüksekliğini ve genişliğini sakla, genişlik = görüntü.shape print (görüntü.shape) quater_height, quater_width = yükseklik / 4, genişlik / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (resim, T, (genişlik, yükseklik)) print (T) cv2.imshow ('orijinal_image', resim) cv2.waitKey (0) cv2.imshow (' Çeviri ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsol Çıkışı - (183, 275) - yükseklik ve genişlik
- T matrisi
]
3. Görüntünün döndürülmesi - Görüntünün döndürülmesi
Görüntünün döndürülmesi, tıpkı döndürme noktasının bir pivot gibi davranması gibi, görüntünün görüntünün ortasındaki bir nokta veya nokta etrafında döndürülmesidir.
Çeviride olduğu gibi T matrisimiz var, muhtemelen rotasyonda M matrisimiz var
Rotasyon matrisi, M matrisi = Cosθ -Sinθ
Sinθ Cosθ
Θ, saat yönünün tersine ölçülen dönüş açısıdır.
Ayrıca, OpenCV'nin cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, dönüş açısı, ölçek) işlevini kullanarak aynı anda görüntüyü satmanıza ve döndürmenize izin verdiğini unutmayın.
Görüntünün dönüşünü elde etmek için hala opencv'nin warpAffine işlevini kullanıyoruz, ancak burada önceki durumda olduğu gibi çeviri matrisi yerine döndürme matrisini kullanıyoruz.
cv2 içe aktar np görüntü olarak içe aktar numpy = cv2.imread ('input.jpg') height, width = image.shape # görüntüyü merkezi etrafında döndürmek için yüksekliği ve genişliği 2'ye bölün. rotation_matrix = cv2.getRotationMatrix2D ((genişlik / 2, yükseklik / 2), 90,1 ) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('orijinal resim', resim) cv2.waitKey (0) cv2.imshow ('döndürülmüş resim ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Artık resim 90 derece döndürülüyor, tuval boyutu aynı kaldığı için tuval boyutu nedeniyle kırpılıyor, ancak döndürme nedeniyle görüntü boyutu tuval boyutuna uymuyor. Ölçekleme faktörü negatif olarak ayarlanarak ayarlanabilir, ancak görüntünün arkasında siyah bir arka plan olmasına izin verir.
Böylece, tahmin ederek veya tahmin ederek görüntünün yüksekliğini ve genişliğini ayarlayabilirsiniz veya görüntüyü döndürmenin başka bir yöntemi de onu transpoze etmektir, ancak görüntüyü saat yönünün tersine 90 derecenin katları kadar döndürür.
4. Ölçekleme, Yeniden Boyutlandırma ve Enterpolasyon
Ölçekleme ve yeniden boyutlandırma afin dönüşümlerdir, görüntünün yeniden boyutlandırılması oldukça uzun süredir yaptığımız şeydir ve ayrıca enterpolasyonla da uğraştık, örneğin, görüntüyü pikselleri genişlettiğimiz daha büyük boyuta yeniden boyutlandırırken, bazı boşluklar var. pikseller ve enterpolasyon burada devreye giriyor.
Görüntü boyutunu küçültmekten büyüğe arttırırken veya görüntü boyutunu büyükten küçüğe küçültürken meydana gelebilir.
Teknik olarak, enterpolasyon, ayrı ayrı bilinen veri noktaları kümesi içinde yeni veri noktaları (pikseller) oluşturma yöntemidir.
Orada interpolasyon yöntemleri çeşitli OpenCV gibi
cv2.INTER_AREA - küçültmek veya örneklemek için iyidir
cv2.INTER_NEAREST - en hızlı
cv2.LINEAR - yakınlaştırma veya örnekleme için iyi (varsayılan)
cv2.CUBIC - daha iyi
cv2.INTER_LANCZOS4 - en iyisi
# yeniden boyutlandırma, cv2.resize işlevi kullanılarak çok kolaydır, argümanları şunlardır: # cv2.resize (image, dsize (output image size), x_scale, y_scale, interpolation) import cv2 import numpy as image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # görüntüyü 3/4 orijinal görüntü boyutu yapalım, yani% 75'e küçültür image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) # Doğrusal enterpolasyon, açık cv için varsayılan yöntem olduğundan, onu bir işlev olarak uygulamamız gerekmez. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # tam boyutlara göre yeniden boyutlandırmayı yapalım image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exactow' image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Görüntü Piramitleri - Yeniden boyutlandırmanın başka bir yolu
Görüntüyü piramit haline getirme, büyütme (görüntüleri büyütme) veya küçültme (görüntüleri küçültme) anlamına gelir.
Yeni görüntünün yüksekliğini ve genişliğini yarı yarıya azaltarak görüntüleri kolayca ve hızlı bir şekilde ölçeklendirmemize olanak tanıyan farklı bir yeniden boyutlandırma yöntemi.
Bu, bir nesneyi her aradığında görüntüleri ölçekleyen nesne dedektörleri yaparken kullanışlıdır.
cv2 görüntüsünü içe aktar = cv2.imread ('input.jpg') smaller = cv2.pyrDown (görüntü) daha büyük = cv2.pyrUp (daha küçük) cv2.imshow ('orijinal', resim) cv2.waitKey (0) cv2.imshow ('daha küçük', daha küçük) cv2.waitKey (0) cv2.imshow ('daha büyük', daha büyük) cv2.waitKey (0) cv2.destroyAllWindows ()
Daha büyük görüntüde, orijinal görüntünün hala aynı boyutta olmasının, daha küçük görüntüden daha büyük görüntüye doğrudan dönüştürüldüğü için biraz bulanık olduğunu fark edeceksiniz. Ancak enterpolasyon yaparsak, görüntü kalitesi bir öncekinden itibaren iyileşir çünkü enterpolasyon, görüntü büyütüldüğünde boşlukları doldururken pikselleri tahmin eder.
Şimdi aynı kodu ancak kübik enterpolasyonla çalıştırmak daha iyi bir büyük görüntü kalitesi sağlar. Aşağıdaki resimler, orijinal görüntü, görüntünün büyütülmüş hali, daha küçük görüntü ve daha küçük görüntünün kübik enterpolasyonlu versiyonu arasındaki karşılaştırmayı göstermektedir.
cv2 görüntüsünü içe aktar = cv2.imread ('input.jpg') smaller = cv2.pyrDown (görüntü) daha büyük = cv2.pyrUp (daha küçük) cv2.imshow ('orijinal', resim) cv2.waitKey (0) cv2.imshow ('daha küçük', daha küçük) cv2.waitKey (0) cv2.imshow ('daha büyük', daha büyük) cv2.waitKey (0) # kübik enterpolasyon kullanarak daha küçük görüntüden dönüştürülmüş daha büyük görüntünün kalitesini artırma img_double = cv2.resize (daha küçük, Yok, fx = 2, fy = 2, enterpolasyon = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOT: Eğer resimlerin birden çok küçük kopyaları, sürekli boyutu büyüyen boyutu veya görüntülerin birden çok büyük nüsha olarak daha küçük ve daha küçük oluyor o zaman kullanabilirsiniz oluşturmak istiyorsanız için döngüler veya ederken döngüleri içine tutarak pyrDown veya pyrUp fonksiyonu.
6. Kırpma - İstediğiniz görüntü bölgesini kesip çıkarın
Görüntüleri kırpmak, bir görüntünün bir bölümünü çıkarmak anlamına gelir.
OpenCV'nin doğrudan kırpma işlevi yoktur, ancak aşağıdaki kodu kullanarak numpy ile kolayca yapılabilir.
Kırpılmış = resim
Görüntü dizisini koyarız ve indeksleme araçlarını veya yöntemini numpy içinde kullanarak, görüntüyü elde etmek için kırpmak istediğimiz dikdörtgeni bir virgülle ayırarak başlangıç satırını bitiş satırına ve başlangıç sütununu bitiş sütununa tanımlarız.
cv2 içe aktar np image = cv2.imread ('input.jpg') yükseklik, genişlik = görüntü.shape # başlangıç piksel koordinatlarını alalım (kırpma dikdörtgeninin sol üst) start_row, start_col = int (yükseklik *.25), int (genişlik *.25) # son piksel koordinatlarını alalım (sağ alt) end_row, end_col = int (yükseklik *.75), int (genişlik *.75) # kırpılmasını istediğimiz dikdörtgeni kırpmak için indekslemeyi kullanın = image cv2.imshow ("orijinal resim", resim) cv2.waitKey (0) cv2.imshow ("kırpılmış resim", kırpılmış) cv2.waitKey (0) cv2.destroyAllWindows ()
Not Eğer yerine doğrudan piksel değerlerini kullanabilirsiniz START_COL veya start_row , sadece kullanıcı için kolay tanımlanmasını almak için verilmiştir.
7. Görüntülerin Aydınlatılması ve Karartılması için aritmetik işlemler
OpenCV'deki aritmetik işlemler temelde görüntüye matrisler eklemek veya çıkarmaktır, matrisler eklemek veya çıkarmak parlaklığın artması veya azalması üzerinde etkiye sahiptir.
Yani matrisleri eklemek veya çıkarmak için onları yaratmalıyız ve numpy'nin np.ones adı verilen ve resmimizle aynı büyüklükte matrisleri veren bir işlevi vardır.
import cv2 np image = cv2.imread ('input.jpg') olarak import numpy # birinin matrisini oluşturun, sonra onu 100 'ölçekleyiciyle çarpın # np.ones tümüyle resmimizle aynı boyutta bir matris verir bu durumda değerler 100 olan M = np.ones (image.shape, dtype = "uint8") * 100 # bunu M matrisini resmimize eklemek için kullanırız # parlaklıktaki artışa dikkat edin = cv2.add (resim, M) cv2.imshow ("Eklendi", eklendi) cv2.waitKey (0) # Benzer şekilde, parlaklıktaki azalmayı da çıkarabiliriz # dikkat edin = cv2.subtract (image, M) cv2.imshow ("subtracted", subtracted)) cv2.waitKey (0) cv2.destroyAllWindows ()
OpenCV, görüntü üzerine birçok farklı görüntü işleme işlemini uygulamak için bu şekilde kullanılabilir. Bir sonraki derste diğer görüntü işleme işlevlerine devam edeceğiz.