27 Haziran 2017 Salı

OMEGA 2 (DERS:1) TANITIM,ÖZELLİKLER



    Omega 2 5 dolarlık fiyatı olan dünyanın en küçük IOT bilgisayarıdır . Raspberry Pi'nin 1/4'ü kadar boya sahip olan Omega 2 içinde Linux sunucusu ve dahili Wi-Fi bulundurmaktadır. 
    Onion firması kickstarter kampanyası ile üstün bir başarı yakalamıştır.
    Şuan Omega'nın iki farklı modeli bulunmaktadır. Bunlar;
    ➥ Omega 2
    ➥ Omega 2 plus

    Bu iki modelin teknik özelliklerini incelersek;


    PIN Yapısı;

Omega 2 Nedir? Ne İşe Yarar
    Omega 2 özellikle IOT projelerinde kullanılması için tasarlanmış bir mini Linux bilgisayarıdır. Tabiki Omega 2 'de bir masaüstü bilgisayarının yaptığı işleri yapması beklenmemelidir. Ama Omega 2 IOT projeleri için gerekli bütün alt yapıyı sağlar.
     Kısacası Omega 2 Arduino nano'nun minikliğini ve güç tüketimini, Raspberry Pi'nin esnekliğini ve gücünü hissetmenizi sağlamaktadır.

Omega 2 Tak Çalıştır Bilgisayardır
    Omega 2 Raspberry pi ve türevleri gibi SD karta işletim sistem dosyaları yazılmasına gerek duymaz.Tak çalıştır bir bilgisayadır.Kurulum oldukça basittir.

Omega 2 Uygulamalar Çalıştırır
    Omega 2 diğer bilgisayarlar gibi uygulamalar çalıştırabilir. Sahip olduğu App Store sayesinde bir çok uygulama keşfedip kullanabilirsiniz.


Omega 2 Bir Çok Dil İle Programlanabilir
    Omega 2; PHP, Python, NodeJs, Ruby, C++ gibi birçok yazılım dili ile programlanabilir.

 


Omega 2 Cloud ile Entegrasyonludur
    Omega 2 Onion Cloud ile entegre halinde çalışır.Bu sayede Omega 2'yi Cloud ve sağlanan API'ler sayesinde istenildiği yerden kontrol etme imkanı vardır. Omega 2 de kod deploy edilebilir ve gerçek zamanlı olarak durum kontrolü yapılabilir.



        

26 Haziran 2017 Pazartesi

OPENCV DERSLERİ (DERS:21) HİSTOGRAM PART-1-BUL,ÇİZ,ANALİZ

HİSTOGRAM NEDİR?

    Histogramı bir görüntünün yoğunluk dağılımı hakkında genel bilgi veren bir grafik veya alan olarak düşünebilirsiniz. Histogram görüntüyü analiz etmenin başka bir yoludur.
    Görüntünün histogramına bakılarak o görüntünün parlaklık,  kontrast, yoğunluk dağılımı vb. gibi bilgiler elde edinebilirsiniz.
    Histogramla ilgili daha detaylı bilgi almak için buradan yardım alabilirsiniz.

 
       Histogram grafiği gri skaladaki resimler için bulunabilir.Yukarıdaki resimde histogram grafiğine bakıldığında sol taraftaki alan daha koyu piksellerin miktarını,sağ taraftaki alan ise daha parlak piksellerin miktarını göstermektedir.


HİSTOGRAM BULMAK

       Histogram bulma açısından hem OpenCV hemde Numpy kütüphaneleri ayrı ayrı işlevlere sahiptir.Bu işlevleri kullanmadan önce histogramla ilgili bazı terminolojileri anlamak gerekmektedir;

       ➤BINS: Yukarıdaki resimde her bir piksel için 0 ile 255 arasındaki yoğunluğunu gösterir. Eğer belirli yoğunluk değerindeki pikselleri ayrı ayrı göstermemiz istenirse ÖRN: 0-15,16-31...240-255 gibi. Ölçeklendirme parametresini 16 olarak ayarlamak gerekmektedir.Böylece 16 ayrı ölçeklendirme yapılacaktır.Yapılan 16 ölçeklendirmeden her birine BIN denir. BINS parametresi OpenCV'de histsize ile temsil edilir.
       ➤DIMS: Veriyi topladığımız parametre sayısıdır.burada bu parametre 1 yapılarak veri toplama işlemi sağlanılır.
       ➤ARALIK: Ölçmek istenilen yoğunluk değeri aralığıdır.Normal ayarlarında [0,255] arası değerleri bulacak şekilde ayarlanmıştır.

    1)OpenCV'de Histogram Hesabı

        Histogram bulmak için OpenCV'de cv2.calcHist() fonksiyonu kullanılır.
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

        ➤images: uint8 veya float32 türünde histogramı bulunacak kaynak görüntüdür.
        ➤channels: Histogram hesaplanan kanal dizinidir.Köşeli parantez içerisinde yazılmalıdır. Örneğin histogramı bulunacak kaynak görüntü gri skalada ise bu değer [0]dır. Renkler kanalları mavi,yeşil,kırmızı içinde bu değer sırasıyla [0],[1],[2] dir.
        ➤mask: Maske resmidir. Tam görüntünün histogramını bulmak için None (yok) kabul edilmelidir. Ancak görüntünün belirli bir bölgesinin histogramı bulunması isteniyorsa bunun için bir maske resmi oluşturulmak zorundadır.
        ➤histSize: BIN sayısını temsil eder. Köşeli parantez içinde yazılmalıdır.
        ➤ranges: Histogram aralığıdır. O değerler arasındaki piksel yoğunluklarını bulur.

        Bir örnek vermek gerekirse bir resimin [0,256] arasındaki histogramını bulan kod;
img = cv2.imread('home.jpg',0)
hist = cv2.calcHist([img],[0],None,[256],[0,256])

    2)OpenCV'de Histogram Hesabı  

        Histogram bulmak için Numpy kütüphanesinde np.histogram()  fonksiyonu kullanılır.
hist,bins = np.histogram(img.ravel(),256,[0,255])

HİSTOGRAM ÇİZDİRMEK



import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('apple.jpeg',0)
cv2.imshow('img',img)
plt.hist(img.ravel(),256,[0,256]); plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('apple.jpeg')
cv2.imshow('img',img)
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
plt.show()

MASKE UYGULAMASI


import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('apple.jpeg',0)

# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)

# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()
         Resim x ekseninde 100-400 arası ve y ekseninde 100-300 arası maskelenerek histogram eğrileri çizdirilmiştir


Ders:20⬅                                                       Ders:22

21 Haziran 2017 Çarşamba

OPENCV DERSLERİ (DERS:20) KONTUR PART-3

DİĞER KONTUR FONKİSYONLARI

    1)Dışbükeylik Kusuru
        Kontur derslerinde part 2'de konveks gövde çizgilerinin konturlarla ilgili olduğu gösterilmiştir.Cismin bu gövdeden sapması konveks(dışbükey) kusuru olarak kabul edilebilir.
        OpenCV kütüphanesinde bu kusuru bulmak için hazır bir komut bulunmaktadır.Bu komut cv2.convexityDefects() komutur. Kullanımı ise ;
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
        Konveks gövde kusuru bulunabilmesi için ilk başta konturun konveks gövdesinin bulunması gereklidir. Yukarıdaki kodda ilk satır konveks gövde bulur. ikinci satır ise o gövdeye ait konveks kusurlarını bulur.
        Bir örnekle pekişterecek olursak ;

        Giriş resmi:
       

        Kod:
import cv2
import numpy as np

img = cv2.imread('yildiz.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255,0)
image,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt = contours[0]

hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)

for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,255,0],2)
cv2.circle(img,far,5,[0,0,255],-1)

cv2.imshow('img',img)
cv2.imwrite('convexdefects.png',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

        Sonuç:
        

        Kodu açıklayacak olursak;
                1. Resim okunur gri skalya çevrilir ve ardından threshold
                    işleminden geçirilerek binary resime dönüştürülür.
                2. Binary hale getirlen resimin konturu bulunur ve
                    ardından bulunan konturun konveks gövdesi bulunur.
                3. Konveks gövdeye ait konveks kusurları bulunur. ve
                    for döngüsü ile her bir konveks kusur noktaları
                    çizdirilir.

    2)Noktalı Çokgen Testi  
        Bu işlev görüntüdeki bir nokta ile bir kontur arasındaki en kısa mesafeyi bulmaya yarar. Nokta kontur dışındayken negatif olan mesafeyi, nokta kontur içindeyken ise pozitif mesafeyi bulur ve nokta kontur üstünde ise mesafeyi sıfır olarak döndürür.
        Örneğin noktanın(50,50) bölgesinde olduğunu varsayarsak en yakın mesafeyi şu şekilde bulabiliriz;
dist = cv2.pointPolygonTest(cnt,(50,50),True)
        Burada üçüncü argüman çok önemlidir koddaki gibi "True" yazılırsa aradaki mesafeyi bulur fakat "False" yazılırsa noktanın konturun dışında mı içindemi yoksa üstünde mi olduğunu belirtir.
        Üçüncü argümanı False olarak ayarlayıp kodu derlediğinizde çıktının 3 farklı tip olduğunu gözlersiniz Bunlar;
                1. (+1): noktanın konturun dışında olduğunu gösterir.
                2. (-1): noktanın konturun içinde olduğunu gösterir.
                3. (0): noktanın konturun tam üstünde olduğunu gösterir.
        Not: Mesafeyi bulmanıza gerek yok ise False argümanını kullanmaya özellikle dikkat edin mesafe bulma işlemi uzun süren bir işlemdir.False kullanmanız kodunuzun 2,3 kat daha hızlı çalışmasını sağlar.

    3)Şekilleri Karşılaştırma
        OpenCV'de iki şeklin veya iki konturun karşılaştırılmasını sağlayan cv2.matchShapes() kullanılır. Bu komut benzerliği gösteren bir metriği döndürür.Sonuç ne kadar düşükse karşılaştırma işlemi bir o kadar daha iyi sonuç vermiş anlamına gelmektedir.
        cv2.matchShapes() komutu Hu-moments değerlerine dayanarak hesaplanır.
        Bir örnekle pekiştirelim;
                3 farklı resmi kıyaslayalım giriş resimleri ise 2 farklı yıldız ve bir dikdörtgen olsun. önce aynı resmi birbiriyle kıyaslayarak birebir aynılıkta hangi değeri verdiğini gözleyelim.Daha sonra ise diğerlerini birbiriyle gözleyelim

        Kıyaslanacak İki resim:
                                  
       
        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('yildiz.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

        


        Kıyaslanacak İki resim:

                          

        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('yildiz2.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

       


        Kıyaslanacak İki resim:

                          

        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('dikdortgen.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

           

        3 farklı sonucu kıyaslayacak olursak;
                1. İlk örnekte aynı resimler kıyaslanmış ve sonuç 0.0 yani
                    birebir benzerlik bulunmuştur.
                2. İkinci örnekte ise birbirine benzer iki yıldız
                    kıyaslanmış ve sonuç 0.00055 gibi bir değer bulunmuş
                    yani birbirine çok benzer olduğu gözlenmiştir.
                3. Üçüncü örnekte ise sonuç 0.3269 gibi bir değer 
                    ve bu iki resmin birbirine çok az benzediği
                    gözlenmiştir.  



Ders:19⬅                                                            Ders:21              

13 Haziran 2017 Salı

OPENCV DERSLERİ (DERS:19) KONTUR PART-2

KONTUR ÖZELLİKLERİ

    Bu yazıda Kontur özellikleri olan katılık,eşdeğer çap,maske görüntüsü vb. parametlerini görüceğiz. Bu parametreler aranan nesnenin özelliklerini daha detaylı ortaya çıkarmaktadır.

    1)En-Boy Oranı
        Nesnenin sınırlıyacı dikdörtgenin genişliğinin yüksekliğine oranıdır.
        
x,y,w,h = cv2.boundingRect(cnt)
aspect_ratio = float(w)/h

    2)Kapsam
        Kapsam alanı,kontur alanının sınırlayıcı dikdörtgenin alanına oranıdır.
area = cv2.contourArea(cnt)
x,y,w,h = cv2.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

    3)Katılık
        Katılık, kontur alanının konveks gövde alanına oranıdır.
area = cv2.contourArea(cnt)
hull = cv2.convexHull(cnt)
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area

    4)Eşdeğer Çap
        Eşdeğer çap, alanı kontur alanı ile aynı olan daire çapıdır.
area = cv2.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)

    5)Oryantasyon
         Oryantasyon, nesnenin yönlendirildiği açıdır.Aşağıdaki kodda ayrıca büyük eksen ve minör eksen uzunluklarıda verilmektedir.
(x,y),(MA,ma),angle = cv2.fitEllipse(cnt)

    6)Maskeleme ve Piksel Noktaları
         Bazı durumlarda bir nesneyi oluşturan tüm noktalara ihtiyaç duyulur.Bu durumda;
mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))

    7)Maksimum Değer,Minimum Değer ve Konumları       
          Bu parametreleri bir maske görüntüsü kullanarak bulabilirsiniz.
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

    8)Ortalama Renk ve Ortalama Yoğunluk
          Burada bir cismin ortalama rengini bulabiliriz.Veya gri tonlamalı bir modda cismin ortalama yoğunluğunu bulabiliriz.Bunları bulabilmek için yine maske kullanılması gereklidir.
mean_val = cv2.mean(im,mask = mask)

    9)Ekstrem Noktalar
          Ekstrem noktalar cisimin en alttaki, en üstteki,en sağdaki ve en soldaki noktaları anlamına gelir.
leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])
          Bir resimde örnek vermek istersek;


Ders:18⬅                                                            Ders:20

11 Haziran 2017 Pazar

OPENCV DERSLERİ (DERS:18) KONTUR PART-1



KONTUR NEDİR?

    Konturlar aynı renk ve yoğunluğa sahip olan tüm kesintisiz noktaları sınır boyunca birleştiren bir eğri olarak basitçe açıklanabilir.Konturlar şekil analizi,nesne algılama ve tanıma için çok yararlı bir araçtır.
  • Kontur bulunması istenirken daha doğru sonuç için binary(siyah-beyaz) formunda resim kullanılmalıdır.
  • FindContours yöntemiyle konturleri bulunan resim komple değişir orjinal halini bir daha kullanılamaz hale gelir. Bunun için resimi yazılımda yedeklemeniz gerekmektedir.
  • OpenCV'de kontur bulma işlemi siyah zeminde beyaz nesne bulmak gibidir.Unutulmamalıdır ki bulunması gereken nesne beyaz arka plan siyah olmalıdır.
    Binary bir görünütünün Konturlarının nasıl bulunacağına bir göz atmak gerekirse;
import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    Orjinal resim okunup önce gri skalaya çevirilmiş ve gri skalaya çevrilen resim binary formata getirilmiştir.
    cv2.findContours() işleminde konturlar bulunmuştur.Bu işleme kodda bakıldığı zaman 3 argümanın olduğu görülmüştür.Bunları sırasıyla açıklarsak;

     1.Birinci argüman kontur bulunacak kaynak görüntüdür.
     2.İkinci argüman kontur alma modudur. 
     3.Üçüncü argüman ise kontur yaklaşım metodur.

    Bu işlem sonucu görüntüyü konturu ve hiyerarşiyi ortaya çıkarır.
Koddaki "contours " değişkenine atanan bilgiler aslında görüntüdeki konturların pythondaki bir listesidir.Her kontur nesnenin sınır noktaları koordinatlarının(x,y) bir Numpy dizisidir.


KONTURLARI ÇİZMEK?

    Konturlar cv2.drawContours() fonksiyonu ile çizdirilir.Bu fonkisyonda ilk argüman kaynak görüntü,ikinci argüman görüntüdeki konturların python listesi,üçüncü argüman konturların indeksi ,dördüncü argüman çizimin rengi ve beşinci argüman çizimin kalınlığıdır.
  • Bir resimdeki bütün konturları çizdirmek için;
img = cv2.drawContours(img, contours, -1, (0,255,0), 3)

  • Tek bir kontur çizilmek istenirse örneğin 4. kontür;
cnt = contours[4]
img = cv2.drawContours(img, [cnt], 0, (0,255,0), 3)



Kontur Yaklaşma Yöntemi

    cv2.findContours ifadesindeki 3. argüman olan bu komut kontur yaklaşma yöntemi adıyla bilinir.
    Yukarıdaki yazılarda kontur tanımı olarak aynı yoğunluğa sahip şeklin sınırları olduğu bahsedilmiştir.Aslında kontur bir şeklin sınır koordinatlarını depo eder.Ancak bütün koordinatları depo ediyor mu sorusuna cevabı bu kontur modu cevap verir.                
    Eğer cv2.CHAIN_APPROX_NONE komutu kullanılsaydı bütün kontur bilgileri saklanacaktı. fakat her durumda bütün kontur bilgilerine ihtiyaç varmıdır ve nasıl kullanabilir.Bir örnekle açıklayalım düz bir çizgiden oluşan bir konturu çizdirmek istenirse bütün kontur bilgilerine ihtiyaç yoktur başlangıç ve bitiş noktalarının koordinatlarını bilmek çizdirmek için yeterlidir. Bu durumda ise cv2.CHAIN_APPROX_SIMPLE komutunu kullanmak yeterlidir. 
    Bir fotoğraf üzerinden ikisi arasındaki farkı açıklayalım;
  • Sol taraftaki resimdeki konturlar CHAIN_APPROX_NONE komutu ile bulunmuş ve çizdirilirken bütün konturlar çizdirilmi görüntü olarak daha güzel dursada verdiği bilgi bolluğu açısından kodda kafa karışıklığına neden olabilir
  • Sağ taraftaki resim ise CHAIN_APPROX_SIMPLE ile bulunmuştur.Nesnenin bulunması için yeterli bütün bilgiyi vermiştir.
    Bu dersi Bir örnekle noktalandıralım;
    Bu örnekte kareyi bulalım ve çizdirelim(SIMPLE metodu kullanılmıştır siz NONE ilede deneyebilirsiniz)
    Giriş resmi:
                                    
    Kod:
import numpy as np
import cv2

im = cv2.imread('kare.png')
cv2.imshow('Orjinal resim',im)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,1)
cv2.imshow('thresh',thresh)
img,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContours(im, contours,-1, (255,0,0), 4)
cv2.imshow('para',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
   Sonuç:
               

Ders:17⬅                                                            Ders:19

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

8 Haziran 2017 Perşembe

OPENCV DERSLERİ (DERS:16) CANNY KENAR ALGILAMA




TEORİ

    John F. Canny tarafından 1986'da geliştirildi. Çok aşamalı bir algoritması vardır ve Biz her aşamayı inceleyeceğiz.

    1)Gürültü Azaltma
        Canny Kenar algılama algoritması çok hassas çalıştığından görüntüdeki istenmeyen gürültüleride kenar olarak algılayabilir.Bunun için yapılması gereken ilk adım "Gaussian Filtresi" uygulanarak resimdeki istenmeyen gürültülerin kaldırılmasıdır.

     2)Görüntünün Yoğunluk Derecesini Bulma
         Filtre uygulanarak düzeltilmiş resim yatay yönde(Gx) ve dikey yönde (Gy)  türevler elde edilmesi için "Sobel" kerneliyle süzülür. Yatay ve Dikey yöndeki iki resim için kenareğimi ve yönü aşağıdaki gibi bulunur.
         Gradiant yönü herzaman kenarlara diktir.Dikey, yatay ve iki diyagonal yönde dört açıdan birine yuvarlanır.  

     3)Maksimum Bastırma
         Eğim büyüklüğü ve yönü alındıktan sonra kenar oluşturmayan,istenmeyen pikselleri kaldırmak için görüntünün tam bir taraması yapılır.Bunun için her bir pikselin eğim yönündeki alanında yer maksimumluğu kontrol edilir.
         Yukarıdaki resim ile açıklayacak olursa "A" noktası kenardaki bir noktadır. Gradiant Direction(Gradiant yönü) kenara dik gelir."B" ve "C" boktaları ise Gradiant yönü içerisindedir.Bu nedenle A noktasının yerel maksimum oluşturup oluşturmadığının öğrenilmesi için B ve C noktalarıyla kontrol edilir. Eğer oluşturuyorsa diğer aşamaya geçilir.Kısacası Bu aşamada ince kenarlı bir Binary(Siyah beyaz) resim elde edilir.

     4)Histerisiz Eşikleme
         Bu noktada tüm kenarların gerçekten kenar olup olmadığına karar verilir.Bunun için iki eşik değeri olan "minVal" ve "maxVal" ihtiyaç duyulur.Yoğunluk Gradiantı maxVal'dan daha büyük olan kenarlar kesinlikle kenar olarak kabul edilir.Yoğunluk Gradiantı minVal'den küçük olan kenarlar ise kesinlikle kenar olarak kabul edilmez.Bu iki eşik değeri arasına giren kenarlar ise bağlantılarına bağlı olarak kenar kabul edilir veya edilmezler.Bu aradaki kenarlar kesin kenar tanımına yani uyan maxVal'dan yüksek olan kenarlara bağlıysa kenar kabul edilir.Aksi taktirde onlarda kenar kabul edilmez.Bir Örnekler açıklarsak;
         Yukarıdaki resimde iki adet kenar gösterilmiştir bu iki kenar minVal ve MaxVal ile kıyaslanırsa;
           ➞A kısmı maxVal'den büyük olduğu için kesin kenardır. 
           ➞C kısmı iki değer arasında kalmış fakat kesin kenara bağlı
               devam ettiği için oda kesin kenar kabul edilir.   
           ➞B kısmı iki değer arasında kalmış fakat herhangi bir kesin
               kenara bağlı olmadığı için kesin kenar kabul edilmemiştir.
         Bu Aşamadan sonra Canny edge işlemi tamamen bitmiş ve resimde istenilen kenarlar bulunmuştur.

ÖRNEK
    Kenar Bulunacak Resim:
    
    Kod:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('X.jpg',0)
edges = cv2.Canny(img,100,200)

plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Canny Edge'), plt.xticks([]), plt.yticks([])

plt.show()

    Sonuç:

Ders:15⬅                                                            Ders:17