Java'da pirinç saydıralım

Bir başka ödev çalışması bir resimdeki pirinç tanelerini bulmaktı. Bu iş biraz daha zor oldu benim için. Matlab içerisinde bwlabel komutuyla nesneleri sayıp etiketlendirebiliyorsunuz. Benim ise ön işlemeden sonra nesneleri kendi yazdığım bir algoritma ile bulmam gerekti. (Kodlar)

Programın sonuç ekran çıktısı aşağıdaki resimde görülebilir:

Gelelim sayma algoritmasının nasıl çalıştığı konusuna. Yukarıdaki resimde de göreceğiniz üzere ilk olarak yapılan işlem resmin siyah-beyaz tonuna çevrilmesi ve pirinç tanelerinin beyaz olarak net bir şekilde gözükmesidir. Bu iş için ön işlem yapılmıştır. Bütün bu işler için JH Labs Java görüntü işleme kütüphanesi kullanılıyor. İlk olarak Threshold filtresi uygulanıyor. Bu filtre yardımıyla varsayılan olarak 173'ten (pikseller 0-255 arası renk kodlarına sahip) aşağı olan renkler siyaha, yukarı olan renkler beyaz'a dönüştürülüyor. Daha sonra bu filtrenin değiştirdiği resim üzerinde kirlilikleri (gürültüleri) temizlemek için ReduceNoiseFilter uygulanıyor. Bu iki filtrenin uygulanması sonucu en soldaki resim ortadaki resime dönüşmüş oluyor. Bu noktadan itibaren pirinçler daha net olduğu için sayma işlemini başlatabiliriz.

Pirinçlerin sayma işleminde satır satır tarama yapılarak, her pikselin renk kodu inceleniyor. Beyaz bir pikselle karşılaşınca pirinç sayısı 1 arttırılıyor ve o beyaz pikselin 4 tarafı özyineli bir fonksiyon yardımıyla siyaha çevriliyor. Bu şekilde ileride aynı pirinci bir daha saymamış olacağız. Bu işlem tüm satırlar bitene kadar tekrarlandıktan sonra en sağdaki resmi ve aşağıda yazan pirinç sayısını buluyoruz. Elle saydığımızda 81 (tartışmalar var, 79 sayan da var :D ) pirinç saydığımız resimde yazdığım program 80 pirinç sayarak bence bir başarıya imza atıyor. Ancak bu programın en büyük dezavantajı önişlemdeki threshold değeri için bir insan müdahelesine ihtiyaç duyması. Genel bir çözüm üretmek çok mümkün gözükmüyor.

(Beseech - Read between the lines)

2 yorum:

hakan dedi ki...

threshold belirlemek icin pek cok otomatik metod(otsu vb...) en kolayi mean intensity degerini kullanmaktir istersen buna standard deviation komponenti de ekleyip sonuclari gelistirebilirsin

Adsız dedi ki...

Peki resmi dosyada nasıl saydırabiliyoruz. Bir türlü beceremedim üstüne attım olmadı birlikte aç dedim olmadı. Yukarıda yazan 173 duruyor sadece.