Histogram İşlemleri


Histogram, sayısal bir resim içerisinde her renk değerinden kaç adet olduğunu gösteren grafiktir. Bu grafiğe bakılarak resmin parlaklık durumu ya da tonları hakkında bilgi sahibi olunabilir.
Resimler günün değişik zamanlarında çekildiğinde farklı gri parlaklık/kontrast değerlerine sahip olurlar. Kapalı havalarda veya ışığın kısıtlı olduğu ortamlarda çekilen resimler koyu gri tonlarda iken güneş ışığına maruz kalan resimler yüksek parlaklığa sahiptir. Özellikle geceleri güvenlik kameralarından alınan görüntülerde histogram eğrisi karanlık ortamların çokluğu nedeniyle düzgün olmayacaktır ve bu görüntüde yer alan ayrıntılar görünemeyecektir.


Bunu engellemek için histogram üzerine uygulanabilecek iki temel işlem vardır. Bunlar histogram eşitleme ve histogram germedir.

Histogram Eşitleme: Histogram eşitleme ile belirli bir ton etrafında toplanan histogram eğrisi (0-255) tonları arasına düzgün bir şekilde dağıtılır böylece resmin renk dağılımının homojen olarak
yapılandırılması sağlanır.


Histogram eşitleme işleminde, resmin kümülatif renk seviyeleri dağılımı üzerinde normal dağılım uygulanmaktır. Bu yeniden dağılım, renk seviyeleri dağılımında dengeleme sağlamaktadır. Histogram eşitleme için geliştirilen algoritma adımları aşağıdaki şekildedir.
• Histogramı çıkar
• Kümülatif histogramı hesapla ve normalize et
• Normalize kümülatif histogram eğrisini kullanarak pikselleri yeniden hesapla

Şimdi adım adım bu işlemleri koda dökelim. Yapılması gereken ilk işlem resmin histogramını çıkarmak. Histogram çıkarmak için yapmamız gereken işlem resmin her pikselini dolaşarak üzerinde olduğumuz pikselin değerini okuyup bu değerin sayısını tutan değişkeni bir artırmak. Her renk seviyesi için değişken tanımlamak yerine 256 uzunluklu bir matris oluşturarak matrisin indisinde renk seviyesini, içerisinde de kaç adet olduğunu saklayabiliriz. Bir resim içerisinde her piksel 3 renkten oluştuğundan bu adım her renk için ayrı ayrı yapılmalıdır.

for( j=0 ; j < kaynak.bminfo.height ; j++)
{
   for( i=0 ; i < kaynak.bminfo.width ; i++)
  {    
        histogramred[(int)kaynak.pixels[i][j].red]++;
        histogramgreen[(int)kaynak.pixels[i][j].green]++;
        histogramblue[(int)kaynak.pixels[i][j].blue]++;
}
}

Koddan da anlaşılacağı üzere resmin tüm pikselleri for döngüsü ile gezilirken histogram matrisleri içerisindeki indisler üzerinde bulunulan rengin seviyesine ayarlanıp içerisindeki değişken bir artırılıyor. Böylece tüm resim tarandıktan sonra histogram[i] matrisi içerisinde i nolu renk seviyesinden kaç adet bulunduğu bulunacaktır.
Kümülatif histogram histogram matrisi üzerindeki i nolu seviye için i ve i den küçük tüm seviyelerinin toplanması ile elde edilir. Örnek olarak verilen histogram matrisi için kümülatif histogram matrisi aşağıdaki gibi olacaktır.

İndis                            : 0    1    2    3    4    5    6   
Histogram Matrisi        : 10  8    9   15   2    5    1   
Kümülatif Hist. Matrisi : 10 18  27  42   44  49  50 

Kümülatif histogram hesabı için aşağıdaki kod yazılabilir.

histogramredk[0]=histogramred[0];
histogramgreenk[0]=histogramgreen[0];
histogrambluek[0]=histogramblue[0];

for( j=0; j <255;j++) {
        histogramredk[j+1]+=histogramred[j];
        histogramgreenk[j+1]+=histogramgreen[j];
        histogrambluek[j+1]+=histogramblue[j];
      }

Kümülatif histogram matrisinin son elemanının değeri resimdeki tüm piksellerin toplam sayısına eşittir. Şimdi kümülatif histogram eğrisini 0-255 arasında değişen bir fonksiyon olarak ifade edecek olursak kümülatif histogramdaki her elemanı toplam piksel sayısına bölerek 0-1 arası dağılımı, sonra bu dağılımı 255 ile çarparak 0-255 arası dağılımı elde edebiliriz. Bu işleme normalizasyon işlemi denir.

for( j=0; j <256;j++) {
        histogramredk[j]=((int)histogramredk[j]*255)/(kaynak.bminfo.width*kaynak.bminfo.height);
        histogramgreenk[j]=((int)histogramgreenk[j]*255)/(kaynak.bminfo.width*kaynak.bminfo.height);
        histogrambluek[j]=((int)histogrambluek[j]*255)/(kaynak.bminfo.width*kaynak.bminfo.height);          }

Bu adımdan sonra kümülatif histogram matrisi indisinde tuttuğu piksel değerine histogram eşitleme işlemi sonrası hangi değerin verileceğini tutan bir matris haline gelir. Örneğimizden devam edecek olursak önce kümülatif histogram matrisimizi toplam piksel sayısına (bu örnek için 50 çünkü 50 renk var) bölerek 4. sıradaki dağılım elde edilir. Ardından en yüksek renk seviyesi (bu örnek için 6) ile çarpılarak normalize histogram matrisi elde edilir.

İndis                             : 0        1        2        3        4        5        6   
Histogram Matrisi         : 10      8        9       15       2        5        1   
Kümülatif Hist. Matrisi  : 10     18      27      42       44      49      50 
Normaliz K. H. Matrisi : 0.2   0.36   0.54   0.84   0.88   0.98     1   
Normaliz K. H. Matrisi : 1.2   2.16   3.24   5.04   5.28   5.88     6   


 Histogram eşitleme işlemi yapılırken eski resimdeki piksel değerleri yerine uygun düşen 5. sıradaki normalize değerler en yakın tam sayıya yuvarlanarak konur.

for( j=0 ; j < kaynak.bminfo.height ; j++)
   {
   for( i=0 ; i < kaynak.bminfo.width ; i++)
     {       
   yeni.pixels[i][j].red = histogramredk[(int)kaynak.pixels[i][j].red];
   yeni.pixels[i][j].green = histogramgreenk[(int)kaynak.pixels[i][j].green];
   yeni.pixels[i][j].blue = histogrambluek[(int)kaynak.pixels[i][j].blue];
     }
   }

Tablodan da görüleceği üzere ilk histogram matrisinde 3 den büyük çok az değer varken histogram eşitleme sonrası bu değerlerin sayısı artmıştır.

İndis                                : 0    1    2    3    4    5    6   
Yeni Histogram  Matrisi   : 0   10   8    9    0    17  6   

Histogram Germe: Histogram germe de histogram eşitlemeye benzer bir işlemi yerine getirir. Histogram eşitlemeden farklı olarak doğrusal bir dönüşümdür. Bu nedenle resmin histogramını düzenlerken içerisindeki verileri daha çok korur. Histogram germe için aşağıdaki formül kullanılır. Burada a resim içerisindeki en küçük değerli pikselin değerini, b ise an büyük değeri göstermektedir. A değeri yeni resimde oluşması istenen en büyük B değeri ise oluşması istenen en küçük değerlerdir.. Histogram eğrisini 0-255 arasına germek için A=255 B=0 seçilmelidir.






Histogram germe kodlaması çok daha kolaydır. Yapmamız gereken her pikselin yeni değerini yukarıdaki formül yardımıyla bulmak ve bu değerle değiştirmektir.

byte b=resim_max(kaynak);
byte a=resim_min(kaynak);
byte fark=b-a;
for( j=0 ; j < kaynak.bminfo.height ; j++)
{
for( i=0 ; i < kaynak.bminfo.width ; i++)
{
yeni.pixels[i][j].red=  (byte) (A-B)*(kaynak.pixels[i][j].red-a)/fark +B;
yeni.pixels[i][j].green=(byte)  (A-B)*(kaynak.pixels[i][j].green-a)/fark +B;
yeni.pixels[i][j].blue= (byte)  (A-B)*(kaynak.pixels[i][j].blue-a)/fark +B; }}

4 yorum:

  1. bu ne biçim bir şey böyle

    YanıtlaSil

  2. I like the helpful information you provide for your articles. I'll bookmark your weblog and check once more right here regularly. I'm fairly certain I will be told many new stuff proper right here! Best of luck for the next! gmail sign in

    YanıtlaSil
  3. There aren't properties currently listed on Realtor. mortgage payment calculator Besides other important financial concerns, paying your mortgage can be a good strategy to use your wages. mortgage payment calculator canada

    YanıtlaSil

Görüntü işleme ile ilgili yeni yazıları ve bu sitede yer alan yazıların güncellenmiş sürümlerini www.imlab.io veya cescript.github.io adreslerinden takip edebilirsiniz.

X