OpenCV-Görüntü Üzerinde Geometrik Dönüşümler

Pazar, Kasım 05, 2017 , , , 0 Comments


Hedefler

Bu yazıda görüntü üzerinde taşıma, döndürme gibi geometrik dönüşüm(transformation) işlemlerini öğreneceğiz.
Kullanılacak Fonksiyonlar: cv2.getPerspectiveTransform, cv2.warpAffine

Dönüşüm(Transformation)

OpenCV; cv2.warpAffine ve cv2.warpPerspective olmak üzere iki dönüştürme(transformation) işlevi sunuyor. Dönüşüm işlemlerinin tamamında bu iki fonksiyondan faydalanmak mümkün olacaktır. Dönüşüm matris olarak; cv2.warpAffine , 2x3 dönüşüm matrisi alırken cv2.warpPerspective , girdi olarak 3x3 dönüşüm matrisini alır.

Ölçekleme(Scaling)

Ölçekleme(scaling) resmin yeniden boyutlandırılması işlemidir. OpenCV, bu amaçla cv2.resize() işleviyle birlikte gelir. Bunun dışında görüntünün boyutu manuel olarak belirtilebilir veya ölçeklendirme(scaling) faktörü belirtilebilir.Bu işlemlerde; küçültme için cv2.INTER_AREA ve yakınlaştırma için cv2.INTER_CUBIC ve cv2.INTER_LINEAR fonksiyonları kullanılabilir. Varsayılan olarak, kullanılan yeniden boyutlandırma amaçları için cv2.INTER_LINEAR yöntemi kullanılır. Aşağıdaki kodlardaki değerler ile oynayıp sonuçları inceleyebilirsiniz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg')
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)

# Veya

height, width = img.shape[:2]
res = cv2.resize(img,(2*width, 2*height), interpolation = cv2.INTER_CUBIC)

Translation(Taşıma)

Burada yapılan işlem kelimenin tam manası ile bir taşıma işlemi. (x,y) düzleminde yapılan taşıma işlemi ne ise burada da onun matris versiyonunu görüntü üzerinde gerçekleştiriyoruz.
import cv2
import numpy as np

img = cv2.imread('ogu.jpg',0)
rows,cols = img.shape

# Matrisimizi (100,50)(wight,height) şeklinde kaydırıyoruz(Shift):
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()

Döndürme(Rotation)

Temelde bir görüntünün belirlenen bir açı kadar döndürülmesi işlemidir. Bu işlemi OpenCV'nin anlayabilmesi için matris formunda matematiksel bir modele ihtiyaç duyulmaktadır:

Bu dönüşüm matrisini bulmak için cv2.getRotationMatrix2D şeklinde bir fonksiyon kullanılabilmektedir. Aşağıdaki örnekte herhangi bir ölçek olmadan görüntüyü 90 derece döndürebilmekteyiz.
import cv2
img = cv2.imread('ogu.jpg',0)

rows,cols = img.shape
M = cv2.getRotationMatrix2D((cols/2,rows/2),90,1)
dst = cv2.warpAffine(img,M,(cols,rows))

Persfektif Dönüşümü

Perspektif dönüşümü için 3X3 dönüşüm matrisine ihtiyaç duymaktayız. Dönüşüm matrisini(transformation matrix) bulmak için görüntü üzerinde 4 noktaya ve bu noktaların toplam çıktısını almaya ihtiyacımız bulunmaktadır. Bu 4 noktanın 3'ü collinear olmamalıdır. Dönüşüm matrisini bulmak için kullanacağımız cv2.getPerspectiveTransformation() fonksiyonundan sonra cv2.warpPerspective fonksiyonunu kullanarak 3X3 matrisimizi elde etmiş olacağız. İşte Kodlar:
import cv2
img = cv2.imread('sudoku_training.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()

Bu kodların çıktısı olan görüntü sayfanın başında bulunmaktadır. Görüntüden de anlaşılacağı gibi sudoku çözücü uygulamasının birinci adımını oluşturan bir uygulamayı yapmış olduk. İlerleyen zamanlarda öğrendiğimiz fonksiyonlarla çalışan bir uygulamayı beraber yapmak umudu ile. İyi çalışmalar.

Kaynakça: https://docs.opencv.org/3.2.0/
Kaynak dosyaları ve Resimleri indirmek için: TIKLAYINIZ

0 yorum: