OpenCV-Görüntü Piramidi

Pazar, Kasım 12, 2017 , , , 1 Comments

Hedefler

Görüntü piramidi oluşturmak.
Görüntü piramidi kullanarak kendi hayali objemizi oluşturmak(blending).
Kullanılacak Fonksiyonlar: cv2.pyrUp(), cv2.pyrDown()

Görüntü Piramidi Hakkında:

Normal şartlar altında tek bir görüntü üzerinde çalışırken sabit bir çözünürlük değeri(resolution) kullanırız. Fakat görüntü işleme işi ile uğraşırken bazı durumlarda aynı görüntü üzerinde farklı çözünürlük değerlerine ihtiyacımız olabilir. Mesela bir görüntü üzerinde yüz tanıma veya tespiti işlemi yaparken; aynı görüntü üzerinde bir dizi farklı çözünürlükte dizi oluşturmalı ve tüm bu yeni dizi içinde nesne taraması yapmalıyız. İş bu görüntü setine görüntü piramidi adı verilmektedir.
İki çeşit görüntü piramidi bulunmaktadır:
1) Gauss Görüntü Piramidi
2) Laplace Görüntü Piramidi

Bir gauss piramidinde yüksek seviye(düşük çözünürlüklü olan) alt seviyedeki(yüksek çözünürlüklü olan) görüntülerden ardışık satırları ve sütünları kaldırarak oluşturulmuştur. Bu işlem devam ettikçe MXN olan matris (M/2)X(N/2) şekline dönüşür. Buna bir octave denir. Aynı desen piramitte yukarılara çıktıkça devam eder(çözünürlük azalır). Benzer şekilde görüntüyü genişletirken(expanding) alan her seviyede 4 katına çıkar.
Laplace piramitleri Gauss piramitlerinin farklı bir formundan oluşturulur. Laplace için OpenCV içinde özel bir fonksiyon tanımlanmamıştır. Bu piramitteki görüntüler Gauss piramidindeki görüntülerin kenar değerlerinin döndürülmesi gibidir. Laplace piramidindeki bir seviye; Gauss piramidindeki bir seviye ile Gauss piramidinin en üst seviyedeki görüntüsünün arasındaki farktan oluşur.

Piramitleri kullanarak Resim Karıştırma(Blending)

Görüntü piramitlerini kullanarak yapabileceğimiz klasik bir uygulama görüntü karıştırma(blending) işlemidir. İki görüntüyü birbirine kaynaştırırken görüntü setlerini yığmamız gerekecek ancak görüntüler arasındaki süreksizlik yeni görüntünün iyi görünmemesine yol açmış olacak. Bu gibi durumlarda görüntü piramidi kullanılarak veri birikimi oluşmadan işlem gerçekleştirilebilir. Bu durumun klasik bir örneğini aşağıda görebilirsiniz.

 işte kodların tamamı:
import cv2
import numpy as np,sys
A = cv2.imread('elma.jpg')
B = cv2.imread('portakal.jpg')
# A için Gauss Piramidi
G = A.copy()
gpA = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpA.append(G)

# B için Gauss Piramidi
G = B.copy()
gpB = [G]
for i in xrange(6):
    G = cv2.pyrDown(G)
    gpB.append(G)
# A için Laplace Piramidi
lpA = [gpA[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpA[i])
    L = cv2.subtract(gpA[i-1],GE)
    lpA.append(L)
# B için Laplace Piramidi
lpB = [gpB[5]]
for i in xrange(5,0,-1):
    GE = cv2.pyrUp(gpB[i])
    L = cv2.subtract(gpB[i-1],GE)
    lpB.append(L)
# SAĞ Ve SOL Yarım Kürelerini Ekliyoruz
LS = []
for la,lb in zip(lpA,lpB):
    rows,cols,dpt = la.shape
    ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:]))
    LS.append(ls)
# Şimdi Yeniden Oluşturma
ls_ = LS[0]
for i in xrange(1,6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])

# Her Yarım Küreye Bağlantı:

real = np.hstack((A[:,:cols/2],B[:,cols/2:]))
cv2.imwrite('Piramid_Karistirma.jpg',ls_)
cv2.imwrite('Direkt_Karistirma.jpg',real)

KaynakçaImage_Mosaic
Kaynak dosyaları indirmek için: TIKLAYINIZ

1 yorum:

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: