10 Haziran 2017 Cumartesi

OPENCV DERSLERİ (DERS:17) RESİM PİRAMİTLERİ


TEORİ
    Bu zamana kadar hep aynı büyüklükte ve aynı çözünürlükte resimlerle çalıştık.fakat işlenecek resiminin bazı durumlarda farklı boyutlarında ve çözünürlüklerinde çalışmamız gerekebilir.Bir örnekle anlatmamız gerekirse bir resimde araba ararken arabanın resimde hangi boyutta olacağından emin değiliz.Bu durumda işlenecek resimin farklı boyutlarda farklı çözünürlükte görüntülerini alıp araba taraması yapmamız  gerekebilir.İşte bu farklı çözünürlükte oluşan resimlere Resim Piramitleri denir.

    İki farklı tür resim piramidi vardır.Bunlar;
        1) Gauss Piramidi 
        2) Laplace Piramidi

    1)Gauss Piramidi
        Bir Gauss piramidindeki yüksek seviye(Düşük çözünürlük),alt seviyedeki(yüksek çözünürlük) görüntüdeki ardışık satırları ve sütunları kaldırarak oluşturulur. Ardından daha üst seviyedeki her piksel alt seviyedeki ve gauss ağırlıkları olan 5 pikselin katkısıyla oluşturulmuştur.Bu işlem yapılarak MxN çözünürlüğünde bir resim M/2xN/2 çözünürlüğünde bir resim haline gelir. Bu nedenle alan orjinal resim alanın 4 kat küçük haline dönüşür.
        Gauss piramidi işlemi "cv2.pyrDown()" ve "cv2.pyrUp()" işlemleri ile gerçekleştirilir
img = cv2.imread('img.jpg')
lower_reso = cv2.pyrDown(higher_reso)
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍       
       🔶Bir Örnek Üzerinden pyrDown işlemini detaylı inceleyelim...
        ➤ Yapılan işlem ile resim alanı 4 kat küçültülsün.                
import cv2
img = cv2.imread('trafik.jpg')
h,w = img.shape[:2]
img1 = cv2.pyrDown(img,dstsize = (w/2,h/2))
cv2.imshow('orjinal resim',img)
cv2.imshow('Dusuk Cozunurluk',img1)
cv2.waitKey()
cv2.destroyAllWindows()
         Kodu açıklayacak olursak; 
         h,w =img.shape[:2]: Resimin en ve boy bilgilerini h,w
           parametrelerine yazar.
         img1 =cv2.pyrDown(img,dstsize=(w/2,h/2)): Orjinal 
           resmi eninden ve boyundan 2 kat küçülterek toplamda 
           orjinal resimin 4 kat küçük hali eldilir.

           Sonuç:         
           
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
         🔶Bir örneklede pyrUp işlemini inceleyelim...
          ➤ Yapılan işlemle giriş resminin alanı 4 kat büyüsün.Yapılan
                işlemde giriş resmini aynı seçilsin.          
import cv2
img = cv2.imread('trafik.jpg')
h,w = img.shape[:2]
img1 = cv2.pyrUp(img,dstsize = (w*2,h*2))
cv2.imshow('orjinal resim',img)
cv2.imshow('Yuksek Cozunurluklu',img1)
cv2.waitKey()
cv2.destroyAllWindows()
          Kodu Açıklayacak olursak;
         img1 =cv2.pyrUp(img,dstsize=(w*2,h*2)): Resim en ve 
            boy parametreleri ikişer kat büyütülmüştür.Totalde resim
            alanı 4 kat büyümüştür.

            Sonuç:
            
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
    1)Laplace Piramidi
        Laplace piramitleri Gauss piramitlerinden oluşur. Laplace piramitleri için özel bir işlem yoktur. Laplace piramiti görüntüleri kenar görüntüleri gibidir.Görüntü sıkıştırma metodu kullanırlar.Laplace seviyesinin üç seviyesi aşağıdaki gibi görünecektir.
    
╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍
Piramit Kullanarak Resim Karıştırma
    Yapacağımız işlemde iki resimi birbirine dikeceğiz.Normalde dikilen iki farklı resim arasında bir uyuşmazlık oluşur piramit yöntemi ile bu uyuşmazlık en aza indirlebilir.Bu olayı bir örnekle açıklamaya çalışalım.
    Elma ve portakal resimlerini birbirne uyumsuzluk olmadan dikelim.Bu olay basitçe şu şekilde yapılır;
    1) Elma ve Portakal resimleri yüklenir.
    2) Elma ve portakal resimlerinin Gauss piramitleri bulunur.
    3) Gauss ve Laplace piramitleri bulunur.
    4) Elmanın sol yarısını portakalın sağ yarısına katar.
    5) Bu ortak görüntü tek bir resimde gösterilir.

       

import cv2
import numpy as np, sys

# resimleri yükle
imgA = cv2.imread('apple.jpg')
imgB = cv2.imread('orange.jpg')

# piramit sayisi
levels = 5

# Gauss piramitini set et
gaussianPyramidA = [imgA.copy()]
for i in range(1, levels):
gaussianPyramidA.append(cv2.pyrDown(gaussianPyramidA[i - 1]))

# Gauss piramitini set et
gaussianPyramidB = [imgB.copy()]
for i in range(1, levels):
gaussianPyramidB.append(cv2.pyrDown(gaussianPyramidB[i - 1]))
# laplace piramitini set et
laplacianPyramidA = [gaussianPyramidA[-1]]
for i in range(levels - 1, 0, -1):
laplacian = cv2.subtract(gaussianPyramidA[i - 1], cv2.pyrUp(gaussianPyramidA[i]))
laplacianPyramidA.append(laplacian)
# Laplace piramidini tersleyerek set et
laplacianPyramidB = [gaussianPyramidB[-1]]
for i in range(levels - 1, 0, -1):
laplacian = cv2.subtract(gaussianPyramidB[i - 1], cv2.pyrUp(gaussianPyramidB[i]))
laplacianPyramidB.append(laplacian)

# Laplace uygula
laplacianPyramidComb = []
for laplacianA, laplacianB in zip(laplacianPyramidA, laplacianPyramidB):
rows, cols, dpt = laplacianA.shape
laplacianComb = np.hstack((laplacianA[:, 0:cols / 2], laplacianB[:, cols / 2:]))
laplacianPyramidComb.append(laplacianComb)

imgComb = laplacianPyramidComb[0]
for i in range(1, levels):
imgComb = cv2.add(cv2.pyrUp(imgComb), laplacianPyramidComb[i])

# Sonuçları gözle
cv2.imshow('image', imgComb)
cv2.imwrite('image.png', imgComb)
cv2.waitKey(0)
cv2.destroyAllWindows()


Ders:16⬅                                                            Ders:18

2 yorum: