5 Temmuz 2017 Çarşamba

OPENCV DERSLERİ (DERS:22) HİSTOGRAM PART-2-HİSTOGRAM EŞİTLEME

HİSTOGRAM EŞİTLEME

    Piksel değerleri belirli bir aralıkta olan bir görüntüyü düşünün.Örneğin çok parlak bir görüntü tüm piksellerin yüksek değerlerle sınırlı kalmasına neden olur. Ancak iyi bir görüntü demek resmin tüm bölgelerinden piksellere sahip olmak demektir.Dolayısıyla histogramı başlangıç ve bitiş noktalarına dağıtmak zorunda kalabilirsiniz.İşte Histogram eşitleme işleminin yaptığı budur.Bu işlem normalde görüntünün kontrastını değiştirir.
    Bu konuda ayrıntılı bilgiye buradan ulaşabilirsiniz.
      Bir resimin histogram aralığını inceleyelim;
        Giriş resmi:
       
        Kod:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image.jpg',0)

hist,bins = np.histogram(img.flatten(),256,[0,256])

cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
cv2.imshow('img',img)
plt.plot(cdf_normalized, color = 'b')
plt.hist(img.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
        Sonuç: 
           
    Resmin histogramına bakıldığı zaman pikseller daha parlak bir noktada toplanmıştır.Fakat tam bir spektruma ihtiyaç vardır.Bunun için parlak bölgenin giriş piksellerini tam bölgedeki çıktı piksellerine eşleyen bir dönüşüm fonksiyonuna ihtiyaç vardır.Histogram eşitleme işlemi bunu yapmaktadır.
    İlk adım olarak minimum histogram değeri bulunur(0 hariç).Ardından histogram eşitleme işlemi uygulanır.
cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
    Bu işlemden sonra giriş piksel değerleri için çıktı piksel değeri hakkında bilgi veren bir arama tablosuna sahip olunur.
img2 = cdf[img]
    Yukarıdaki Giriş resmi için histogram eşitleme işlemini uygulayalım;
        Kod:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image.jpg',0)

hist,bins = np.histogram(img.flatten(),256,[0,256])

cdf = hist.cumsum()
cdf_normalized = cdf * hist.max()/ cdf.max()
cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
img2 = cdf[img]
cv2.imshow('img',img2)
plt.plot(cdf_normalized, color = 'b')
plt.hist(img2.flatten(),256,[0,256], color = 'r')
plt.xlim([0,256])
plt.legend(('cdf','histogram'), loc = 'upper left')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
        Sonuç:
        
    Yeni resimin histogramına bakıldığı zaman pikseller düzgün bir şekilde dağılmış histogram eşitliği sağlanmış ve ideal bir görüntü elde edilmiştir. 
    Histogram eşitleme işlemi nesne bulmada resimlerdeki aranacak nesnenin parlaklık oranının bütün resimlerde aynı olmasını sağlar nesne tanımada önemli bir rol oynar.
    Yukarıdaki kodda yapılan uzun işlemler sonucunda histogram eşitleme sağlanmıştır.Fakat OpenCV'de bu işlemi tek satırda yapan özel bi fonksiyon bulunmaktadır.Bu fonksiyon cv2.equalizeHist() fonksiyonudur.
    Yine aynı giriş resmi için bu yöntemi uygulayalım:;
        Kod:
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image.jpg',0)
equ = cv2.equalizeHist(img)
res = np.hstack((img,equ))
cv2.imwrite('res.png',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
        Sonuç:
        

CLAHE(Kontras Sınırlı Histogram Eşitlemesi)
    Önceki histogram eşitlemeleri görüntünün genel kontrastını göze alır.Çoğu durumda bu iyi bir fikir değildir. Örnek olarak bir resimde anlatmak gerekirse;
    Yukarıdaki resime önceki histogram eşitleme yöntemi uygulandığında yüzün daha çok kaybolduğu görülmektedir.Bunun nedeni ise histogramın belirli bir bölgeyle sınırlı kalmamasıdır.
    Bu sorunu çözmek için CLAHE yöntemi kullanılır.Burada giriş resmi 8x8'lik bölgelere ayrılmıştır. Ardından herbir bölge önceki aşamalardaki gibi histogram eşitlemesine tabi tutulmuştur.Buradaki amaç her bir histogram eşitlemeyi küçük bir bölgede uygulamaktır. Fakat dezavantaj olarak resimdeki gürültü oranı artacaktır.Bunu önlemek için ise kontrast sınırlaması uygulanır. Herhangi bir bölgenin kontrast değeri sınırın üstündeyse bu pikseller histogram eşitlemesi uygulanmadan önce kesilir ve diğer bölgelere eşit olarak paylaştırılır.Eşitleme sonrasında ise bölgelerin çıkarılabilmesi için bilinear enterpolasyon uygulanır.
    Yukarıdaki giriş resmini bu eşitlemeye sokar isek;
        Kod:
import numpy as np
import cv2

img = cv2.imread('image.jpg',0)

clahe = cv2.createCLAHE(clipLimit=5.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)

cv2.imwrite('clahe_2.jpg',cl1)
cv2.waitKey(0)
cv2.destroyAllWindows()
        Sonuç:
        
    Sonuca bakıldığı zaman yüz heykeli detayları kaybedilmeden histogram eşitleme yapılmıştır.


Ders:21⬅                                                      Ders:23

OMEGA 2 (DERS:2) KUTU AÇILIMI,KURULUM

KUTU AÇILIMI
    Omega mini IOT bilgisayarının 2 adet modeli bulunmaktadır bunlar Omega 2 ve Omega 2+ modelleridir. Elimde Omega 2 olduğundan dolayı ders serisi omega 2 üzerine devam edecektir. İşleyiş olarak omega 2 ve omega 2+ modellerinin hiç bir farkı yoktur.
    Omega 2'nin USB vs gibi çevresel birimleri olmadığı için omega 2 için üretilmiş olan Expansion Dock ile birlikte kullanılacaktır.
    Kutu açılımlarına bakalım;


    Kuruluma başlamadan önce Expansion Dock Hakkında kısaca bilgi verelim;
    Resimden de görüldüğü üzere expansion dockta reset butonu, power butonu pin headerlari,micro usb portu ve usb portu bulunmaktadır.Bu sayede omega 2'yi kullanmak daha rahat olacaktır.



İLK KURULUM
    Öncelikle Omega 2'yi Expansion Dock'a aşağıdaki resimdeki gibi takın.
   
    Omega 2 Expansion docktaki micro usb portundan beslemesini almaktadır.Bunun için bir micro usb kablosu ile ister bilgisayara ister bir adaptöre bağlayarak beslemesini verin.
    Fakat Omega 2'nize beslemenin gitmediğini göreceksiniz. Expansion Dock'taki power switch'ini ON konumuna aldığınız zaman Omega'ye ait ledin yanıp södüğünü gözleyeceksiniz.
    Daha Sonra bilgisayarınızada wifi arattırın ve aşağıdaki gibi bir wifi ismi çıkacaktır(Omega-XXX). Bu wifi ağına bağlanın. Wifi şifresi ise bütün omega modelleri için default olarak "12345678" olarak belirlenmiştir.
    Omeganızın Wi-Fi'sine bağlandıktan sonra tarayıcınıza "192.168.3.1" yazın ve kurulum aşamasına geçin.
    Tarayıcınıza omeganızın IP'sini yazdıktan sonra yukarıdaki resimdeki gibi bir arayüz karşınıza çıkmaktadır.Daha sonra Start butonuna basarak kurulumun ilk aşamasına geçebilirsiniz.
    Tuşa basıldıktan sonra aşağıdaki resimdeki gibi bir kullanıcı giriş sayafası karşınıza gelir.Omega 2'de default olarak kullanıcı adı "root" şifre ise "onioneer"dir bunları girerek  "Log In" butonuna basın ve giriş yapın. 
    
    Tuşa bastıktan sonra aşağıdaki resimdeki gibi Omega'nızın bağlanacağı internet ve şifre bilgisini istemektedir.
    Choose Wi-Fi kısmından bağlanacağınız interneti seçtikten sonra o internete ait şifreyi girerek "Configure WiFi" butonuna basın ve interneti yapılandırın.
    Bu işlem tamamlandığında bilgisayarınızın Omega 2'nin Wifisine olan bağlantısı kopacaktır.Tekrar bağlanarak "192.169.3.1" IP'sini tarayıcınızda açarak önceki adımları tekrarlayın.
    İnternet Bağlantı ayarlamsı kısmında ise aşağıdaki gibi bir durumla karşılaşacaksınız. Bu adımı daha önce yaptığınız için "Skip Step" butonuna basarak bir sonraki aşamaya geçin.
    Bir sonraki aşama ise Omega 2'nin Cloud servisine kayıt olma işlemidir.Bu aşama zorunlu değildir.Fakat ileride çok işinize yaracağından yapmanızı öneririm.
    Öncelikle Register butonuna basarak Cloud servisine emailiniz ile kayıt yaptırın emailinize gelen aktivasyon linkine tıklayarak aktive edin ve daha sonra Cloud servisi için cihazınıza aşağıdaki resimdeki gibi bir isim verin ve kapatın.
    Daha sonraki aşama ise işletim sistemini ve konsolu yükleme işlemidir bunu için "install Console" seçeneği tikli olmalıdır.ve İnstall butonuna basın.
    Yükleme işlemi yaklaşık 5-10 dakika sürmektedir.Yüklenme işlemi bittikten sonra aşağıdaki gibi bir sayfa ile karşılaşacaksınız.
    Bu sayfayı gördüğünüzde yükleme işleminiz bitmiş demektir.Sayfanızı yenileyerek işletim sisteminize girebilirsiniz.
    Şimdi mini Linux işletim sistemimizi inceleyelim ve gerekli konsol kurulumunu yapalım.
    Sayfayı yenilediğinizde giriş için kullanıcı adı ve şifre istemektedir.Bunlar için gene "root" kullanıcı adını ve "onioneer" şifresini girerek sistemimize girelim. Kullanıcı arayüzü aşağıdaki resimdeki gibidir.
    Settings sekmesine bakıldığı zaman aşağıdaki gibi bir arayüz ile karşılaşılmaktadır.
    Burada omega 2nin özellikleri bulunmaktadır.Sol köşedeki soğan simgesine basarak ana menüye geri dönelim ve Terminal'e basalım.
    Terminale basıldığı zaman yüklenmesi gerektiği söylenmektedir. Yükle butonuna basarak terminali yükleyelim.Terminal yüklenmesi bittiği zaman sayfayı yenilememizi istemektedir.
    Sayfayı yenilendiğinde tekrar terminale girildiğinde;
     Böyle bir görüntü ile karşılaşacaksınız login kısmına root yazıp enterlarsanız şifreyede onioneer yazıp enterlarsanız işletim sisteminizin terminaline buradan ulaşmış olacaksınız.