Skip to content

Görüntünün Geometrik Dönüşümleri

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()


Last update: April 16, 2024
Created: April 16, 2024