Çarşamba, Şubat 27

Histogram Eşitleme

Histogram eşitleme elimizde bulunan mevcut bir imge için en uygun histogramın çıkarılmasıdır. Elimizde histogram dizisinin olduğunu varsayalım, bu dizi normal bir imge için dağınık bir yapıda değildir. Yani dizi içerisinde resmin koyuluğuna gore belli alanlarda yığılma vs olabilirOrijinal görüntüdeki gri değerler birbirine çok yakındır. Bu görüntünün yoğunluk fonksiyonu uniform değildir. Bunun anlamı gri değerlerin olasılıkları eşit değildir. İdeal bir görüntüdeki yoğunluk fonksiyonu düzgün dağılımlı olmalıdır. Eğer orijinal histogram üniform histograma çevrilirse yeni görüntü ideale çok yakın olur. Bu dönüşüme histogram eşitleme (histogram equilization) denir. Eğer orijinal görüntü histogramı bir başka histograma kendi dağılım fonksiyonunu dönüşüm fonksiyonu olarak dönüştürürse sonuç görüntünün histogramı eşitlenir.
görüntü işlemede eldeki bir resmin histogramında belli bir gri seviyede yoğunlaşmış dağılımı tüm gri seviye aralığına yaymaktır.eğer eldeki resmin gri seviye(bkz: gray level) dağılımı belli değerlerde yoğunlaşmışsa,işlem sonrası görüntüde iyileştirme, daha önce belli olmayan ayrıntıların belirginleşmesi sağlanabilir ama eğer eldeki resimde gri seviyesinin piksel sayısına göre dağılımı zaten geniş bir aralıktaysa bu işlem pek bir işe yaramaz, o durumda eldeki resmin histogramını kendi belirlediğimiz bir histograma eşlemek gerekirHistogram eşitlemede de amacımız bu yığılmaları en uygun şekilde dağıtmaktır.

Histogram Eşitleme Algoritması
• Öncelikle elimizdeki imgenin histogramını çıkarırız.
• Bundan sonra da grilik seviyelerinin imge içerisinde bulunma olasılıklarını tutan bir dizi yapmamız gerekir .Bunun yapılması icin; maximum girilik seviyesine kadar istenilen seviyenin toplam bulunma sayıları histogram dizisinden alınır ve toplanır ... Ornek: 69 grilik seviyesi için 0'dan 69 a kadar olan seviyelerin sayıları histogramdan çekilir ve toplanır. Bu değer olasılık dizisi içerisinde saklanır.
• Bu toplama işlemleri sonucunda oluşan olasılık dizisi imge boyutlarının çarpımına bölünür (bulunma olasılık işlemi)
• Sonucta yeni resim oluşturulurken mevcut imge üzerindeki herhangi bir grilik seviyesi için olasılık dizisinden gerekli değer çekilir ve 255 çarpılıp yeni resimde işlenir. Örnek: eski resimde A(5,5) 'te 69 grilik seviyesi ile karşılaştık , yeni resimde 5,5 konumuna olasılık dizisinden 69 için hesaplanmış değerin 255 ile çarpımını koyacağız










Program Kodu
#include
#include
#include
#include
typedef struct pgm {
char str[3];
int width;
int height;
int max;
int *data[700]; } pgm;

void pgm_read(char* filename, pgm* pgmfile)
{
FILE* fp;
char str[3],comment[100],chr;
long i,k;
int j;

fp=fopen(filename,"r");
if (!fp) {
printf("Cannot open the file..%s...\n",filename);
exit(1);
}

fscanf(fp,"%s",str); //dosyanin türü, P5 (data binary) ya da P2(data ascii)
strcpy(pgmfile->str,str);
printf("%s\n",pgmfile->str);
fscanf(fp,"%s",comment);

if (comment[0] == '#') { //comment var demektir,satir okunur,
fgets(comment,100,fp); //daha sonra width,height ve max okunur.
fscanf(fp,"%d",&pgmfile->width);
fscanf(fp,"%d",&pgmfile->height);
fscanf(fp,"%d",&pgmfile->max);
printf("%s\n",comment);
}
else { // comment olmayabilir o zaman okunan width degeri olur.
sscanf(comment,"%d",&pgmfile->width); //height ve max degerleri okunur.
fscanf(fp,"%d",&pgmfile->height);
fscanf(fp,"%d",&pgmfile->max);
};

printf("%d\n",pgmfile->width);
printf("%d\n",pgmfile->height);
printf("%d\n",pgmfile->max);

for (i=0;iheight;i++)
pgmfile->data[i]=(int*) malloc (sizeof(int) * pgmfile->width);




if (strcmp(str,"P2") == 0) {
for (i=0;iheight; i++)
for (k=0; kwidth;k++) {
fscanf(fp,"%d",&j);
pgmfile->data[i][k]=j;
};
};
if (strcmp(str,"P5") == 0) {
for (i=0;iheight; i++)
for (k=0;kwidth;k++){
chr=fgetc(fp);
pgmfile->data[i][k]=chr;
};
};
fclose(fp);
}


void pgm_write(char* filename,pgm* pgmfile)
{
FILE* fp;
long i,j;
unsigned char chr;

fp=fopen(filename,"w");

fprintf(fp,"%s\n",pgmfile->str);
fprintf(fp,"%d\n",pgmfile->width);
fprintf(fp,"%d\n",pgmfile->height);
fprintf(fp,"%d\n",pgmfile->max); //degerler yazilir

if (strcmp(pgmfile->str,"P2") == 0) {
for (i=0;iheight;i++)
for (j=0;jwidth;j++)
fprintf(fp,"%d ",pgmfile->data[i][j]);
};
if (strcmp(pgmfile->str,"P5") == 0) {
for (i=0;iheight;i++)
for (j=0;jwidth;j++) {
chr=pgmfile->data[i][j];
fprintf(fp,"%c",chr);
};
}; //data yazilir
fclose(fp);
}
int main(int argc,char* argv[])
{
pgm PGM;
pgm_read(argv[1],&PGM);



double s_hist_eq[256]={0.0}, sum_of_hist[256]={0.0};
long i, j, n, histogram[256]={0};
int k,m;

n = PGM.width * PGM.height;

for (i=0;i<256;i++) // pdf of image
{
for (j=0;j<256;j++)
{
m=PGM.data[i][j];
histogram[m]++;
}

}
for (i=0;i<256;i++)
{
s_hist_eq[i] = (double)histogram[i]/(double)n;
}



sum_of_hist[0] = s_hist_eq[0];
for (i=1;i<256;i++) // cdf of image
{
sum_of_hist[i] = sum_of_hist[i-1] + s_hist_eq[i];
}

for(i=0;i {
for(j=0;j {
k = PGM.data[i][j];
PGM.data[i][j] = (int)rint( sum_of_hist[k] * 255.0 );
}
}
pgm_write(argv[2],&PGM);

}

0 yorum: