· Hakan Çelik · OpenCV / Görüntü İşleme · 3 dk okuma
Görüntünün Geometrik Dönüşümleri

- 1. Boya Fırçası Olarak Fare
- 2. Canny Kenar Algılama
- 3. Görüntü Geçişleri
- 4. Görüntü Piramitleri
- 5. Görüntülerde Aritmetik İşlemler
- 6. Görüntülerle İlgili Temel İşlemler
- 7. Görüntünün Geometrik Dönüşümleri
- 8. Görüntüyü Yumuşatma - ( Smoothing Images )
- 9. Histogramlar
- 10. Konturler ( Contours )
- 11. Morfolojik Dönüşümler
- 12. Opencv Nedir Ve Kurulumu
- 13. Opencv Resim Işlemleri
- 14. Opencv Video Işlemleri
- 15. Opencv'de Çizim Fonksiyonları
- 16. Performans Ölçüm Ve Geliştirme Teknikleri
- 17. Renk Alanlarını Değiştirme
- 18. Renk Paleti Olarak Parça Çubuğu ( Trackbar )
- 19. Resim Eşikleme
Görüntünün Geometrik Dönüşümleri
Hedefler
- Çevirme, döndürme ve afin dönüşümü gibi görüntülere farklı geometrik dönüşüm uygulamayı öğreneceğiz.
- Bu fonksiyonu öğrenceğiz :
cv2.getPerspectiveTransform
Dönüşümler
Transformations
OpenCV, cv2.warpAffine ve cv2.warpPerspective olmak üzere her türlü dönüştürme işlemine sahip olabileceğiniz iki dönüştürme işlevi sunar. cv2.warpAffine, 2x3 dönüşüm matrisi alırken cv2.warpPerspective, girdi olarak 3x3 dönüşüm matrisini alır.
Ölçekleme
Scaling
Ölçeklendirme yalnızca resmin yeniden boyutlandırılmasıdır. OpenCV, bu amaçla cv2.resize() işleviyle birlikte gelir. Görüntünün boyutu manuel olarak belirtilebilir veya ölçeklendirme faktörünü belirtebilirsiniz. Farklı enterpolasyon yöntemleri kullanılır. Tercih edilen enterpolasyon yöntemleri küçültme için cv2.INTER_AREA ve yakınlaştırma için cv2.INTER_CUBIC(slow) ve cv2.INTER_LINEAR’dir. Varsayılan olarak, kullanılan yeniden boyutlandırma amaçları için cv2.INTER_LINEAR interpolasyon yöntemi kullanılır. Bir girdi resmini aşağıdaki yöntemlerden biriyle yeniden boyutlandırabilirsiniz:
import cv2
import numpy as np
img = cv2.imread('messi5.jpg') # resmi aldık
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC) # yenidem boyutlandırdık
#veya
height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC) # yenidem boyutlandırdıkÇeviri
Çeviri, cismin bulunduğu konumun değişmesidir. (x, y) yönündeki değişimi biliyorsanız, olmasına izin verin , dönüşüm matrisi yi aşağıdaki gibi oluşturabilirsiniz.

Np.float32 türünde bir Numpy dizisi haline getirebilir ve cv2.warpAffine() fonksiyonuna iletebilirsiniz. (100,50) ‘lik bir kayma için aşağıdaki örneğe bakın:
import cv2
import numpy as np
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv2.warpAffine(img,M,(cols,rows))
cv2.imshow('img',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()Cv2.warpAffine() işlevinin üçüncü argümanı, (genişlik, yükseklik) /(width, height) formunda olması gereken çıkış görüntüsünün boyutudur. Genişliği = sütunların sayısını ve yüksekliği = satırların sayısını hatırlarsan.
Rotasyon
Bir görüntünün bir açıyla döndürülmesi,
formun dönüşüm matrisi ile sağlanır

Ancak OpenCV, ayarlanabilen dönme merkezi ile ölçeklendirilmiş dönüş sağlar; böylece istediğiniz herhangi bir konumda döndürebilirsiniz. Modifiye dönüştürme matrisi şu şekilde verilir:


Bu dönüşüm matrisini bulmak için, OpenCV bir fonksiyon, cv2.getRotationMatrix2D sağlar. Aşağıdaki örnekte, görüntüyü herhangi bir ölçeklendirme olmadan merkeze göre 90 derece döndüren kontrol edin.
img = cv2.imread('messi5.jpg',0)
rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))
Afin Dönüşüm
Affine Transformation
Afin dönüşümde, orijinal görüntüdeki tüm paralel çizgiler çıkış görüntüsünde paralel olacaktır. Dönüşüm matrisini bulmak için, giriş görüntüsünden üç noktaya ve çıkış görüntüsündeki karşılık gelen konumlara ihtiyacımız var. Sonra cv2.getAffineTransform, cv2.warpAffine’e geçirilecek 2x3 bir matris oluşturacaktır.
Aşağıdaki örneği kontrol edin ve seçtiğim noktalara da bakın (bunlar Yeşil renkle işaretlenmiştir):
img = cv2.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv2.getAffineTransform(pts1,pts2)
dst = cv2.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
Perspektif Dönüşümü
Perspective Transformation
Perspektif dönüşümü için 3x3 dönüşüm matrisine ihtiyacınız var. Düz çizgiler dönüşümden sonra bile düz kalacaktır.Bu dönüşüm matrisini bulmak için, giriş görüntüsünde 4 nokta ve çıktı görüntüsünde karşılık gelen noktalara ihtiyacınız var.Bu 4 nokta arasından 3’ü aynı çizgide olmamalıdır. Sonra dönüşüm matrisi cv2.getPerspectiveTransform fonksiyonuyla bulunabilir. Daha sonra bu 3x3 dönüşüm matrisi ile cv2.warpPerspective’ı uygulayın.
img = cv2.imread('sudokusmall.png')
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv2.getPerspectiveTransform(pts1,pts2)
dst = cv2.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()
Hakan Çelik

