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.
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.
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; }} |
bu ne biçim bir şey böyle
YanıtlaSilaynen
YanıtlaSil
YanıtlaSilI 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
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