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:

  1. Yaklaşık 2 hafta boyunca sizin OpenCv derslerinize çalışıyorum. Çok faydasını gördüm ve eminim ki bir çok insan da en az benim kadar fayda görmüştür. Sizlere çok teşekkür ediyorum ve en kısa sürede de derslerin devamının gelmesini umut ediyorum. :)

    YanıtlaSil