• 締切済み

画像を読み込んでヒストグラムを作るプログラム

2値化画像を読み込んで、ヒストグラムを表示させるプログラムを作りたいのですが、 以下のソースを作成したのですが実行中にエラーが発生して困っています。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> #define width 640 #define height 480 int main(int argc, char* argv[]) { unsigned char image[640*480]; unsigned char header32[1078];//ビットマップ情報 int i; int *histogram; FILE *fp1; unsigned char buffer1[640*480]; for(i=0; i<640*480; i++) { image[i]=0; buffer1[i]=0; } fp1=fopen("koshimizu1.bmp","rb"); // fread(image,1,640*480,fp1); fread(header32,1,1078,fp1); fread(buffer1,width,height,fp1); fclose(fp1); for(i=0;i<256;i++){ histogram[i]=0; } for(i=0;i<640*480;i++){ histogram[image[i]]++; } for(i=0;i<256;i++){ printf("%d %d \n",i,histogram[i]); } return 0; }

みんなの回答

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

int histogram[256]; であれば > for(i=0;i<256;i++){ > histogram[i]=0; > } > for(i=0;i<640*480;i++){ > histogram[image[i]]++; > } > for(i=0;i<256;i++){ > printf("%d %d \n",i,histogram[i]); > } で問題ないと言うことです ただimage[ ]は全て0のままですよ。

  • _himajin_
  • ベストアンサー率65% (128/195)
回答No.2

正直言って、かなり無茶苦茶です。 まず、histogram が未初期化のポインタです。 もしこのソースに合わせるなら、int histogram[640*480]; のほうがまだ適切です。 で、この histogram はヒストグラムデータが入るものだと思いますが、 このソースでしていることは、実質的に histogram[0] を640x480回インクリメントしているだけです。 (image[640*480] はすべて 0 で埋められていて、それ以後変更されていないため) ただし、histogram 自体が未初期化のポインタなので、何かわからないデータを壊してます。 (それ以前に、histogram[i]=0;で壊しまくりですが…) buff1[] にビットマップデータを読み込んでいるなら、それを見てインクリメントするかどうかを判断する if 文を書く必要があります。 (1bppデータならbit単位で見る必要があります) さらに、ビットマップというのはWindows Bitmapではない何か別なフォーマットのことでしょうか? もしそうではなく、Windows Bitmapなら、ファイルの構造がどうなっているかくらいは調べたほうが良いです。 たとえば、BITMAPHEAEDERは14バイトしかありませんし(その後ろにいろいろくっついてきますが)、 2値画像 = 1bit/pixel を指しているのか、24bit/pixel で白と黒だけを使ったデータなのかも不明ですが、どちらにしてもデータの持ち方を誤解しているように思えます。 あと細かいところですが、width と height をマクロにするなら、その意味で使っている 640 と 480 はすべてマクロに置き換えたほうが良いです。 (そうしないとマクロにする意味がない)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

> int *histogram; histogram がどこを指しているかわからない状態のまま、 > for(i=0;i<256;i++){ > histogram[i]=0; > } > for(i=0;i<640*480;i++){ > histogram[image[i]]++; > } > for(i=0;i<256;i++){ > printf("%d %d \n",i,histogram[i]); > } このあたりの処理を行なっている点に問題があります。

jkusjd
質問者

補足

ご指摘ありがとうございます。 int *histogram;は納得しました。 しかし、 > for(i=0;i<256;i++){ > histogram[i]=0; > } > for(i=0;i<640*480;i++){ > histogram[image[i]]++; > } > for(i=0;i<256;i++){ > printf("%d %d \n",i,histogram[i]); > } こちらの方は、 http://wis02.ec.t.kanazawa-u.ac.jp/index.php?Muramoto%2F%B2%E8%C1%FC%BE%F0%CA%F3%BD%E8%CD%FDprogram#td26447f の濃淡ヒストグラムの作成を参考(ほぼそのままですが)に作成したのですが、 どこがいけないのかが分かりません。 教えていただけるとありがたいです。

関連するQ&A