6 Aralık 2016 Salı

Blob Detection Using OPENCV (C++)


GitHub (https://github.com/mribrahim/Blob-Detection) to download the codes and  contribute the project

A Blob means a group of connected pixels in an image that share near intensity values. In the image below, the goal is to detect the blobs and identify some properties belong to that blobs, as if regionprobs in Python (http://scikit-image.org/docs/dev/api/skimage.measure.html#skimage.measure.regionprops).

Measure Properties of Regions 

center:                point2f -> Center coordinates of region 
area:                   float -> Number of pixels of region. 
perimeter:          float -> Perimeter of region. 
eccentricity:       float -> Between 1 and 0. (1 for circle) 
solidity:              float -> Between 1 and 0. ( Area / ConvexHullArea ) 
compactness:     float -> Between 1 and 0. ( Area / BoundingRect Area ) -- measure of how close to a rectangle 
mean_intensity:  Vec3b -> mean intensity values of three channel(blue,green,red) of the region 
bounding_box:   Rect -> Bounding box of the region 

9 Kasım 2016 Çarşamba

C++ XML işlemleri


XML, farklı sistemler/yazılımlar arasında veri paylaşımını sağlamak için geliştirilmiş bir standarttır. Böylece paylaşılmak istenen verilerin, standart format kullanılarak yazılımdan bağımsız bir şekilde saklanması ve iletilmesi sağlanır.

C++ ile XML dökümanları oluşturmak ve okuyup ayrıştırmak için çeşitli kütüphaneler mevcuttur. Bunlardan bazıları :



6 Kasım 2016 Pazar

HSV renk uzayı, Renk filtreleme



RGB renk uzayı renkleri farklı tonlardaki üç ana rengin (kırmızı,yeşil,mavi) karışımı ile tanımlar.
HSV renk uzayı ise Hue, Saturation ve Value terimleri ile rengi tanımlar. RGB de renklerin karışımı kullanılmasına karşın HSV de renk, doygunluk ve parlaklık değerleri kullanılır. Doygunluk rengin canlılığını belirlerken parlaklık rengin aydınlığını ifade eder. HSV uzayında siyah renk için renk ve doygunluk değerleri 0 ile 255 arasında herhangi bir alabilir iken parlaklık değeri sıfırdır. Beyaz renkte ise ise parlaklık değeri 255'dir.




Buna göre herhangi bir bilgisayarlı görme/görüntü işleme uygulamasında belirli renkteki bir nesneyi ayırt etmek istediğimizde HSV renk uzayını kullanmak daha elverişlidir. Çünkü RGB nin aksine sadece hue değerini kullanarak eşik değer uygulama suretiyle renkleri daha net ayırt edebiliriz.

Örneğin; Aşağıda soldaki Muslera fotoğrafından kırmızı bölgeleri ayırt etmek istediğimizde; HSV renk uzayını kullanınca sağ üstteki sonucu, RGB renk uzayını kullanınca sağ alttaki sonucu elde ediyoruz. İlgili Python kodlarına yazının devamında ulaşabilirsiniz.


27 Ekim 2016 Perşembe

Python - Opencv kamera kalibrasyonu



Kamera kalibrasyonu 3 boyutlu bilgisayarlı görme uygulamalarında son derece önemlidir. Malumunuz kamera ile elde edilen görüntüler 2 boyutludur ve ayrıca kullanılan lensten kaynaklanan bozulmalar da vardır. Örneğin kullanılan lense göre görüntünün merkezindeki pikseller ile kenarlardaki piksellerin yer değiştirme oranları(nasıl tarif edeceğimi tam bulamadım ama literatürde bknz. lens distortion) farklı olabilir (Şekil 1). Kameranın üretiminden kaynaklanan bu bozukluğu gidermek için; kameranın iç parametreleri diye adlandırılan lens parametrelerini tahmin edip görüntüye düzeltme işlemi uygulamak gerekir. Bunun için gerçek büyüklüğü bilinen bir nesne referans olarak kullanılmalıdır. Genelde satranç tahtası (chessboard) bu amaçla kullanılır ve görüntü işlemede yaygın kullanılan OPENCV içerisinde de bu amaçla geliştirilmiş fonksiyonlar mevcuttur.


Şekil 1


19 Ekim 2016 Çarşamba

Python - VTK ile 3 Boyutlu (3D) görüntü oluşturma

Bu yazıda .stl uzantılı dosyayı okuyup VTK kütüphanesi ile 3 Boyutlu görüntüyü oluşturan Python kodunu paylaşacağım.

8 Ekim 2016 Cumartesi

Python - Dicom medikal görüntülerin açılması (SimpleItk, Vtk, Pydicom)

Medical görüntülerin depolanması/saklanması için DICOM dosya formatı yaygın olarak kullanılmaktadır.  DICOM görüntüler hastane ve kliniklerdeki görüntüleme cihazlarından elde edilen görüntülerin kalitelerinin korunmasını sağlar ve görüntünün elde edilişine dair kesit aralığı, modalite, protokol adı gibi parametreleri de içerir. Bu yazımda dicom görüntülerin Python ile nasıl açılacağına/okunacağına dair bilgiler vereceğim.

25 Eylül 2016 Pazar

Python - Webcam Capture GUI with PyQT

I will show an example how to capture webcam and display into QT widget. Opencv is used to capture the video and the stream is shown in a GUI. The main reason for integrating PyQT and Opencv is to be able to provide UI for computer vision applications using Opencv and Python.

QT Designer is used to design the GUI. User Interface in this example is so simple with only two buttons and a Qlabel(videoframe) is to show the stream.


30 Ağustos 2016 Salı

Python - OPENCV ile kişi sayma


Bu yazı kapsamında Python ile OPENCV kütüphanesini kullanarak tavana yerleştirilmiş bir kameradan elde edilen görüntüler ile hareket eden nesneleri (bizim örneğimizde kişileri) saymaya çalıştık. Bunun için kullanacağımız algoritmanın temel adımlarını şu şekilde sıralayabiliriz;


1- Background Subtraction : Sabit bir arka plandan her gelen yeni görüntüyü çıkararak görüntüde (videoda) değişen kısımların yani hareketli nesnelerin belirlenmesi

2- Object Tracking : Belirlenen bu ön plandaki nesnelerin takip edilmesi

3- People Counting : Takip edilen bu nesnelerin (hareketli kişilerin) belirli noktayı geçtiklerinde sayılması ve geçiş yönünün belirtilmesi

( Kullandığımız videoyu şuradan indirebilirsiniz.. )

Background Subtraction için OPENCV kütüphanesi içerisindeki fonksiyonlardan arka planının modellenmesinde Gaussian Mixture Model'in kullanıldığı cv2.BackgroundSubtractorMOG() fonksiyonunu kullanıyoruz.

Bunun için ilk olarak masaüstünde kayıtlı olan çekilen alanın boş bir görüntüsünü yüklüyoruz. Daha sonra ise videoyu yükleyip her bir gelen frame 'e backgroundsubtraction işlemini uyguluyoruz.



17 Mayıs 2016 Salı

Python - Uydu Görüntülerinde Gölge Alanların Bulunması

Uydu görüntülerinde uzamsal çözünürlüğün artması, metre(hatta cm) mesafelerine kadar düşmesi nispeten küçük nesnelerin de algılanabilmesine olanak sağlamıştır. Uzamsal çözünürlüğü yüksek olan bu görüntüler kullanılarak kent alanlarınındaki değişikliklerin analizi, otomatik gözlemlenmesi gibi çalışmalarda kullanılabilmektedir. Bunun için uzaktan algılama görüntülerinde binaların tespit edilmesi üzerine bir hayli çalışma gerçekleştirilmiştir. Binaların tespit edilmesinde yararlanılan önemli bir özellik ise binaların oluşturduğu gölgelerdir. Bu görüntülerin gündüz vakti çekildiği düşünüldüğünde gölgelerden hareket edilmesi suretiyle binaların tespit edilmesine yönelik çalışmalar gerçekleştirilmiş ve başarılı sonuçlar alınmıştır. 

Gölge bulmanın neden önemli olduğunu bina örneğinden yola çıkarak açıklamış olduk(Tabi ki sadece bununla kısıtlanamaz). Bu yazı kapsamında size "Multi-spectral False Color Shadow Detection" makalesinde açıklanan gölge alanların çıkarılması algoritmasını açıklamaya çalışacağım.

Uygulamanın gerçekleştirilmesinde kullanılan uydu görüntüleri

http://biz.nevsehir.edu.tr/ozgunok/tr/407

adresinden alınmıştır.

Yukarıda linkini verdiğimiz veri seti içerisindeki bir görüntüyü açmak için gerekli Pyton kodları aşağıda verilmiştir. .tif uzantılı görüntüleri açmak için osgeo kütüphanesinden faydalanılmıştır. Bu kütüphane ile görüntüyü numpy array olarak okuyunca eksenler kaymış yönünü şaşırmış olarak geliyor :) Bunun için swapaxes komutu ile ufak bir ayar çekiyoruz. Daha sonra ise RGB ve NIR bandlarını ayrı ayrı matrislerde tutuyoruz. ( Not: tif dosyasındaki görüntülerin band sırası B-G-R-NIR, ayrıntılı bilgi için tıklayınız )





25 Nisan 2016 Pazartesi

Python - Hiyerarşik Kümeleme

Bir veriyi kümelere ayırmak basit olarak birbirine benzer olan elemanları aynı grupta toplama işlemidir (Neye göre benzer bu önemli!). Kümelere ayırma işlemi için kullanılan en yaygın ve basit algoritma k-means algoritmasıdır. Bu algoritma girdi olarak belirtilen (k) adet küme için farklı merkez koordinatlar seçerek, bir iterasyon dahilinde ilgili kümeye en yakın elemanların eklenmesi suretiyle küme merkezlerinin yerleri değişmeyene kadar tüm elemanların bir kümeye atanması mantığına göre çalışır. Bu yöntemde (k) küme sayısının baştan belirlenmesi gerekmektedir. Fakat çeşitli uygulamalarda veriler gruplara ayrılırken birbirlerine benzer olan kaç küme olduğu/olabileceği her zaman bilinemeyebilir. Bu gibi durumlarda hiyerarşik kümelemeyi kullanmak daha mantıklı olacaktır. 

Hiyerarşik kümelemede iki farklı yaklaşım kullanılabilir. Bunlar; tüm elemanlar tek bir küme gibi düşünülüp kümeleri ayırarak farklı kümeler oluşturmak veya her bir elemanı başlangıçta bir küme kabul edip birbirlerine benzer olan kümeleri tek bir küme altında toplamaktır. Python kullanarak gerçekleştireceğimiz uygulamada ikinci yaklaşımı kullanılmıştır. Zaten her iki yaklaşım da sonuç olarak aynı kapıya çıkacaktır.

Hiyerarşik kümeleme için ilk olarak veri setini oluşturan her bir elemanın ( herhangi bir bilgiyi içeren vektör olabilir, görüntü olabilir ...vs ) birbirleri arasındaki benzerliği/mesafeyi ölçmek ve bunu bir matriste saklamak gerekmektedir. Örneğin; N adet veriyi kümelere ayırmak istediğimizde, bu işlem sonucunda NxN lik bir distance_matrix elde etmiş olacağız. Verilerin birbirleri arasındaki benzerliği ölçmek için birçok metrik kullanılabilir, bu verinin içeriğine ve yapılacak olan uygulamaya göre değişkenlik gösterebilir. Bu ilk aşamadan yani distance_matrix i oluşturduktan sonra yapılacak iş birbirine benzer iki eleman tek bir küme oluşturacak şekilde tüm elemanları bir eleman ile eşleştirip yeni kümeler oluşturmak ve oluşan bu kümelerin de birbirleri arasındaki mesafeleri hesaplayıp tekrar yeni bir distance matrix oluşturmaktır. Bu işlem tekrarlanarak tüm elemanlar tek bir küme altında toplanana dek devam edildiğinde, bir ağaç yapısı şeklinde birbirine benzer elemanlar bir kümede toplanmış olacaktır. Bu işlem yapılırken önemli olan birleştirilen kümelerin birbirlerine olan uzaklıklarını hesaplamaktır. Bunun için çeşitli yöntemler bulunmaktadır ve bunlar linkage strategies olarak isimlendirilir. Seçilecek herhangi bir stratejiye göre hiyerarşik kümeleme yapıldığında birbirinden farklı ağaç yapıları oluşabilir. Kullanılabilecek bazı birleştirme stratejileri şunlardır;




1 Nisan 2016 Cuma

Python - Görüntüde Entropi Hesaplanması


Bilgi teorisinde p(x) olasılık yoğunluk fonksiyonuna sahip X rastgele değişkeninin entropisi şu şekilde tanıımlanır;


Görüntüde entropi değeri hesaplanırken ise p(x) olasılık fonksiyonu yerine, piksel olasılık değerleri kullanılır. Bunun için görüntüdeki piksel değerlerinin dağılımını veren histogramın hesaplanması gerekmektedir. Örnek görüntü ve hesaplanan histogram grafiği aşağıda verilmiştir.







31 Mart 2016 Perşembe

Python - Temel bileşen analizi (PCA)


Hiperspektral görüntülerde PCA ile boyut indirme


PCA ( Temel bileşen analizi ) çok boyutlu veriyi, her bir boyut arasındaki varyansı maksimum yapacak şekilde yeni bir uzaya dönüştürmeye yarar.

PCA adımları

- kovaryans_matris = cov ( numpy.transpose(data) ) 

bu adımda her bir özdeğere karşılık gelen özvektör hesaplanıyor

- Ozdeger, Ozvektor = numpy.linalg.eig(kovaryans_matris)

düşük özdeğere karşılık gelen özvektörler ihmal edilirse veri boyutu minimum bilgi kaybı ile küçültülür. ( Yani özvektörler matrisinden bazı sütunlar atılacak )

- donusturulmus_veri = numpy.dot( data, Ozvektor )

Bu adımda geri dönüşüm işlemi yapılıyor, eğer bazı özvektörler elenmiş ise orjinal veri seti eksiksiz olarak geri dönüştürülemez fakat yine de genel bilgi belirli oranda korunmuş olacaktır

- data_geri_elde_edilen = numpy.dot ( donusturulmus_veri, numpy.transpose(Ozvektor) )