Java ile Histogram Eşitleme

C0M!S3R-eX

Uzman üye
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:
<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]
 

MasterGg

Yeni üye
6 Ara 2006
1
0
Arkadasım bu makaleyi kimden aldıgını yazar mısın lutfen.Emege saygı gostermenizi rica ediyorum...
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.