- 14 Kas 2006
- 1,174
- 27
Yapay zeka* klasik programlama yöntemleriyle çözülemeyen problemleri çözmeye yarayan yöntemlerin bütünüdür diyebiliriz. Bu yöntemde* bir veriden bir sonuç çıkartılması için* ilk önce ham verinin işlenip* girdi kümesinin küçültülmesi gerekir. Yapay zeka yöntemlerinden biri olan sayısal görüntü işleme alanında da* girdi olarak verilen bir resmin* gereksiz verilerden arındırılması gerekir. Bu makalede* Java' da basit görüntü işlemeyi ve sayısal görüntü işleme yönteminde çok kullanılan bir yöntem olan histogram eşitlemeyi anlatacağım. İlk önce Java' da resim dosyalarını nasıl yükleyeceğimizle başlayalım. Java' da her sayısal görüntü veri yapısı Image sınıfından türetilir. Image sınıfı* tek başına pek kullanılmaz* daha çok bu sınıftan türetilen BufferedImage ve VolatileImage yapıları kullanılır. Ben bu makalede BufferedImage yapısını kullandım. Bu sınıfları kullanabilmek için programın başına;
Kod:
yazmamız gerekiyor. Programda BufferedImage sınıfını kullanacağımızı söylemiştik. Önce BufferedImage sınıfındaki bazı metodlara bakalım.
getGraphics() -BufferedImage sınıfının* üzerinde işlem yapılabilecek olan Graphics nesnesini döndürür.
getHeight() -Resmin satır sayısını döndürür.
getWidth() -Resmin sutun sayısını döndürür.
getRGB(int x* int y) -Resmin (x*y) koordinatındaki piksel değerini döndürür.
setRGB(int x* int y) Resmin (x*y) koordinatındaki piksel değerini setler.
Bir BufferedImage nesnesini kullanabilmek için* bir Image nesnesine yüklediğimiz resmi BufferedImage nesnesine çizmemiz gerekir. Resmimizi BufferedImage nesnesine yüklediğimize göre* üzerinde işlem yapmaya başlayabiliriz.
Kod:
Histogram eşitleme:
Resim üzerinde piksel işlemleri yapmak için ilk bilinmesi gereken* piksellerin değerlerinin ne şekilde tutulduğudur. Java’ da piksel değerleri* Mavi(B)* Yeşil(Y)* Kırmızı(R) ve Transparency(Şeffaflık)(T) değerlerinden oluşur. Bu değerlerin 32 bitlik bir tamsayı üzerinde;
Kod:
<code>import java.awt.*;import java.awt.image.*;</code>
yazmamız gerekiyor. Programda BufferedImage sınıfını kullanacağımızı söylemiştik. Önce BufferedImage sınıfındaki bazı metodlara bakalım.
getGraphics() -BufferedImage sınıfının* üzerinde işlem yapılabilecek olan Graphics nesnesini döndürür.
getHeight() -Resmin satır sayısını döndürür.
getWidth() -Resmin sutun sayısını döndürür.
getRGB(int x* int y) -Resmin (x*y) koordinatındaki piksel değerini döndürür.
setRGB(int x* int y) Resmin (x*y) koordinatındaki piksel değerini setler.
Bir BufferedImage nesnesini kullanabilmek için* bir Image nesnesine yüklediğimiz resmi BufferedImage nesnesine çizmemiz gerekir. Resmimizi BufferedImage nesnesine yüklediğimize göre* üzerinde işlem yapmaya başlayabiliriz.
Kod:
<code>private boolean yukle(String konum){ try { im = Toolkit.getDefaultToolkit().getImage(konum); bim = new BufferedImage(im.getWidth(null)* im.getHeight(null)* BufferedImage.TYPE_INT_RGB); bim.getGraphics().drawImage(im* 0* 0* null); } catch(Exception exc) { JOptionPane.showMessageDialog(null* "Yuklemede Hata"* "Hata"* JOptionPane.ERROR_MESSAGE); return false; } return true;}</code>
Histogram eşitleme:
Resim üzerinde piksel işlemleri yapmak için ilk bilinmesi gereken* piksellerin değerlerinin ne şekilde tutulduğudur. Java’ da piksel değerleri* Mavi(B)* Yeşil(Y)* Kırmızı(R) ve Transparency(Şeffaflık)(T) değerlerinden oluşur. Bu değerlerin 32 bitlik bir tamsayı üzerinde;
Kod:
[COLOR=red][B][SIZE=2]0-7. bitler B
8-15. bitler G
16- 23. bitler R
24-31. bitler T[[/SIZE][/B][/COLOR]/CODE]
[COLOR=navy]değerlerini oluşturur. Bu değerleri elde etmek için (p pikselimizin sayı değeri olmak üzere);[/COLOR]
Kod:
[LEFT][COLOR=red][B][SIZE=2]B = p&(0xFF)G = (p>>>8)&0xFFR = (p>>>16)&0xFFT = (p>>>24)&0xFF[/SIZE][/B][/COLOR][/LEFT]
[COLOR=navy]işlemleri yapılır. Bu örnekte işlemler sadece renkler üzerinde yapılacak* T değeri işlenmeyecektir. [COLOR=blue][SIZE=2][B][I]Histogram eşitleme yönteminin amacı; bir resimdeki piksel değerlerinin histogramını çizdiğimizde* bir sayıya doğru yığılma oluyorsa* bu yığılmayı azaltmak ve sayıları dağıtmaktır.[/I][/B][/SIZE][/COLOR] Bu yöntem ile karanlık çekilmiş bir resim daha belirgin hale getirilebilir.[/COLOR]
[CENTER][IMG]http://img91.imageshack.us/img91/3/image001yu3.jpg[/IMG][/CENTER]
[COLOR=blue][B][I]Histogram eşitleme yöntemi 3 adımda gerçekleştirilir.[/I][/B][/COLOR]
[COLOR=navy][COLOR=blue][B][SIZE=2]1) [/SIZE][/B][/COLOR]Her bir sayı için ( 0 255)* piksel değeri o sayıya ait olan piksellerin toplamı bulunur.[/COLOR]
Kod:
[LEFT][COLOR=red][SIZE=2][B]<code> int array[][] = new int[3][256]; for(int i = 0;i<array.length;++i) { //0: B* 1: G* 2: R for(int k = 0;k<bim.getHeight();++k) { for(int j = 0;j<bim.getWidth();++j) { array[i][ ( bim.getRGB(j* k) >>> (i*8) ) & 0xFF ]++; } } }</code>[/B][/SIZE][/COLOR][/LEFT]
[COLOR=navy][COLOR=blue][SIZE=2][B]2)[/B][/SIZE][/COLOR] Bu dizideki her bir eleman* bir önceki elemanın değeriyle toplanır.[/COLOR]
Kod:
[LEFT][COLOR=red][SIZE=2][B]<code> int payda = bim.getHeight() * bim.getWidth(); for(int i = 0;i<array.length;++i) { for(int k = 1;k<array[i].length;++k) { array[i][k] += array[i][k-1]; } }</code>[/B][/SIZE][/COLOR][/LEFT]
[COLOR=navy][COLOR=blue][SIZE=2][B]3)[/B][/SIZE][/COLOR] Sonuçta çıkan dizideki her eleman* resimdeki piksel sayısına bölünür ve en yüksek piksel değeri ile çarpılır.[/COLOR]
Kod:
[LEFT][COLOR=red][SIZE=2][B]<code> for(int i = 0;i<array.length;++i) { for(int k = 0;k<array[i].length;++k) { array[i][k] /= payda; array[i][k] *= 255; } }</code>[/B][/SIZE][/COLOR][/LEFT]
[COLOR=navy]Bu işlemleri yaptığımızda* elimizde 256 elemanlı bir dizi bulunacaktır. Elimizdeki diziyi tekrar resime aktarmamiz gerekmektedir. Tek yapmamiz gereken* her piksele (eğer dizinin piksel değeri a ise) dizideki a. elemanı atamamız olacaktır.[/COLOR]
Kod:
[LEFT][COLOR=red][SIZE=2][B]<code> int value* temp; for(int i = 0;i<bim.getHeight();++i) { for(int k = 0;k<bim.getWidth();++k) { value = bim.getRGB(k* i); value &= 0xFF000000;//T değerinin aynı kalmasını sağlar. for(int j = 0;j<array.length;++j) { //R*G*B değerleri için ayrı ayrı temp = ((bim.getRGB(k* i))>>>(j*8))&0xFF; temp = array[j][temp]; temp = temp<<(8*j); value |= temp; } bim.setRGB(k* i* value); } }</code>[/B][/SIZE][/COLOR][/LEFT]
[COLOR=darkorange][B][SIZE=2]Histogram eşitlemenin kullanım alanları:[/SIZE][/B][/COLOR]
[COLOR=navy][B][B][I]İyi hoş* biz bunları yaptık ama ne işe yarayacak diyebilirsiniz. Histogram eşitleme* bir çok yöntem için kullanışlı bir metoddur. Bir resimdeki nesneleri saydırmak için (mesela greysacale* kötü kalitede bir resimdeki pirinçler) * resmi ilk önce histogram eşitlemeden geçirirsek saydırmak kolay olacaktır. Yada* en basitinden* kendi çekmiş olduğunuz ama flaşın yetmediği fotoğrafları histogram eşitlemeden geçirirseniz* fotoğraflar daha belirgin olacaktır.[/I][/B][/B][/COLOR]