C Dilinde Histogram Çıkarma

Bu konuyu okuyanlar

mrtfb123

Öğrenci
Katılım
18 Kasım 2015
Mesajlar
37
Reaksiyon puanı
0
Puanları
6
Merhaba arkadaşlar bir dosyadan görüntü çekip bunun histogramını nasıl oluşturabilir. Hocamız Bir kaç örnek kod verdi Visual studio da yapılmasını istedi fakat ben yapamadım. Yardımcı olursanız sevinirim.
 

Ekli dosyalar

  • 11cab193-cd4f-46bc-9777-02c5ecdab24a.jpg
    11cab193-cd4f-46bc-9777-02c5ecdab24a.jpg
    82.4 KB · Görüntüleme: 890
  • 5001b0bf-90b0-4c41-b5b0-39ad42c587d4.jpg
    5001b0bf-90b0-4c41-b5b0-39ad42c587d4.jpg
    69.3 KB · Görüntüleme: 781

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Bir dosyadan görüntü çekip onun histogramını oluşturmak ne demek ?
 

mrtfb123

Öğrenci
Katılım
18 Kasım 2015
Mesajlar
37
Reaksiyon puanı
0
Puanları
6
bir resim dosyasını c dilinde açıp onu okuyup histogram grafiğini oluşturmak olsa gerek. hocamızın bize dediği bunlar örnek kodlar. ( Resimde paylaştım) dosyanın içindeki fotoğrafın histogramını çıkartın. Araştırdım ama hiç birşey bulamadım.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Öncelikle histogram ama tabii wiki kapalı olduğu için ben yazayım.
A histogram is an accurate graphical representation of the distribution of numerical data. It is an estimate of the probability distribution of a continuous variable (quantitative variable) and was first introduced by Karl Pearson.[1] It is a kind of bar graph. To construct a histogram, the first step is to "bin" the range of values—that is, divide the entire range of values into a series of intervals—and then count how many values fall into each interval. The bins are usually specified as consecutive, non-overlapping intervals of a variable. The bins (intervals) must be adjacent, and are often (but are not required to be) of equal size.[2]
Yâni histogram dediğimiz şey kısaca belli bir veri grubunun belirlenmiş aralıklara göre çubuk grafikle grafikle gösterilmesinden ibarettir. Bunun için elinizde bir veri seti veya tablo olması gerekli ki onu histograma çevirebilesiniz. Görüntünün histograma çevrilmesi diye bir şey yok. Bir şey bulamamanız normâl çünkü hocanız sizden olmayan bir şey istemiş veya siz anlamamışsınız. Bence hocanızın sizden istediği şey bir görüntü içerisindeki pixellerin renk değerlerini çekip ona göre bir histogram oluşturmak ama bu red, green, blue mu olacak belli bir sıklıkta mı olacak, aralıklar nasıl belirlenecek ?
Üzülüyorum okullarımızı hâline. Görüntünün histogramını oluşturmak:)
 

mrtfb123

Öğrenci
Katılım
18 Kasım 2015
Mesajlar
37
Reaksiyon puanı
0
Puanları
6
evet pixel pixel renk değerlerini çeki 0-256 arasındaki renk kodlarıyla bir histogram isitiyor. İşin aksi derse gidemedim ve kaç kere yanına gittim. aralığı kodda verdiğini kodu çözmem gerektiğini söyledi(Resimdeki kodlar) sadece kırmızı yeşil mavi değil başka renk kodlarıda olduğunu söyledi.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
evet pixel pixel renk değerlerini çeki 0-256 arasındaki renk kodlarıyla bir histogram isitiyor. İşin aksi derse gidemedim ve kaç kere yanına gittim. aralığı kodda verdiğini kodu çözmem gerektiğini söyledi(Resimdeki kodlar) sadece kırmızı yeşil mavi değil başka renk kodlarıda olduğunu söyledi.
Hiçbir zaman ödev yapmıyorum, gençliğimde para karşılığı yaptığım olmuştur:DAma keşke yapmasaydım diyorum şimdi.
Siz ödevi kesin kurallarıyla anlayın, üzerinde uğraşın, takıldığınız yer olursa buraya sorun, yardımcı olan çıkar.
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
Tatlı dilin yaptıramayacağı iş yok, c ile görüntü işleme yapmadım hiç ama anladığım kadarıyla anlatayım. Yol göstermiş olurum, anlamadığınız yer olursa gene sorarsınız. Ama gönderdiğim kodları lütfen iyice inceleyin elinize kağıt-kalem alarak. Sonra sorun olursa söylersiniz.

#include <stdio.h>

void main ()
{
char filename[100];
int image[500][500], histogram[256], xsize, ysize, file_ok;
printf ("Enter the image file name: ");
scanf ("%s", filename);
/* 1/ buraya kadar olay yok buradan sonrasını inceleyelim.
get_image içinde son üç parametrenin call by reference
olduğuna dikkat edelim. fonksiyona gidelim.
*/
file_ok = get_image (filename, image, &xsize, &ysize);
// 3/ evet get_image çalıştı pixel değerleri artık elimizde.
if (file_ok == 0)
{
printf ("file error. \n");
}
else
{
// 2'deki return 1 olmuşsa histogram çıkarabiliriz artık.
// find_histograma atlayalım.
find_histogram (image, xsize, ysize, histogram);
print_histogram (histogram);
}

}

int get_image (char* filename, int im[][500], int* xsize, int* ysize)
{
FILE* infile;
int i, j;
// 2/ dosya boş değilse açtık
if ((infile == fopen(filename, "r")) != NULL)
{
// bunun ne yaptığını anlamadım ancak amacının xsize ve ysize'ı
// elde etmek olduğunu biliyorum.
fscanf (infile, "%d %d", xsize, ysize);
/* üstteki satırdan sonra xsize ve ysize değerleri artık dolu.
döngüler bütün resim bitene kadar dönecek.
*/
for (i = 0; i < *ysize; i++)
for (j = 0; j < *xsize; j++)
/* bu satır o andaki pixeldeki değeri &im ile kendisine
gönderilen diziye aktarıyor. gene call by reference
kullanılmış & operatörüne dikkat!
ayrıca pixelden gelen değerin [0, 255] aralığında
olacağını varsayıyoruz. Hangi resimlerde bu aralıktadır?
Size soru.
böylece döngüler bitince image[500][500] içine
pixellerin değerleri girilmiş oluyor.
*/
fscanf ( infile, "%d", &im[j]);
// bunun tek esprisi tüm pixellerin düzgün alındığını doğrulamak
return 1;

}
else
{
return 0;
}
}

// 4/ int hist[] ile call by reference var gene dikkat.
void find_histogram (int image[][500], int xsize, int ysize, int hist[256])
{
int i, j;
// asıl olay bu döngülerde!
for (i = 0; i < 256; hist[i++]=0); //**
/* hocanız yazmış, hist = 0, i++
i++'nın bir esprisi yok zaten. neden her seferinde hist=0
int hist[256] = {0} kodunu c++ destekliyor, c destekliyor mu
hatırlamıyorum. Bu kodun esprisi hist[256] içindeki bütün
değerlerin 0 olduğundan emin olmak. Çünkü int c; dedikten sonra
c'nin ne olduğunu bilemiyoruz, aynı şey hist[256]'da da geçerli.
zaten döngü ; ile bitmiş, tek amaç bu.

*/
for (i = 0; i < ysize; i++)
for (j = 0; j < xsize; j++)
// burada i < xsize ve j < ysize deseydik bir şey fark eder miydi, size bir soru daha ?
hist[image[j]]++;
/*
burada image[j] içindeki değerin hist[256] içindeki sayısını
bir arttırıyoruz. yukarıda image[j] içinde 0-255 aralığındaki
sayıların olacağından bahsettik hatırlayın.
image[300, 322] pixelinde diyelim ki 64 değeri var.
hist[256] ** kısmında tamamen sıfırlarla dolmuştu.
ama hist[image[300, 322]] ile artık hist[64]'ün değeri 1 artacak.
böylece resimdeki bütün renklerin oranını belirlemiş oluyoruz.
diyelim ki elimizde simsiyah bir resim var o zaman hist[256]
dizisinin içi şöyle olacak.
hist[0]. elemanın değeri 250000 olacak.(resim 500x500 unutmayın)
diğer bütün elemanlar da sıfır olacak.
*/
}

// sadece histi bastırıyoruz, burada bir şey yok.
void print_histogram (int his[256])
{
int i;
for (i = 0; i < 256; i++)
printf("%d \n", hist);
}

forum boşlukları mahvetti.
buraya da attım dosya şeklinde, en alttaki indir butonundan indirin, üstteki indir reklam.
histogram.c - 4 KB

 

mrtfb123

Öğrenci
Katılım
18 Kasım 2015
Mesajlar
37
Reaksiyon puanı
0
Puanları
6
öncelikle çok teşekkür ederim. 0-255 siyah-beyaz resimler için kullanılır program üzerinde biraz çalıştım visual studio .c uzantılı bir şekilde run ettirdim fakat hatalar aldım dikkatimi çeken bir nokta 7.satırda kullanıcı tarafından bir dosya ismi istiyor fakat ekrana hiç bir şekilde kullanıcının girebilceği bir pencere açılmıyor. hatayıda 7. satırdan sonraki satırlarda veriyor.
--- Gönderi Güncellendi ---
Şu şekilde hatalar aldım.
OL5vQz.png
 

mirinkirin

Doçent
Katılım
4 Temmuz 2016
Mesajlar
708
Reaksiyon puanı
358
Puanları
63
8. satırdaki hata scanf yerine scanf_s yazmakla çözülebilecek bir şey. Hataların bazıları diğer fonksiyonların mainden sonra olması ve prototiplerinin tanımlanmamış olmasıyla ilgili. Sanırım siz dersle pek ilgilenmemişsiniz, maalesef daha fazla yapabileceğim bir şey yok.
 
Üst