ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

QNo.3998532 画像を読み込んでヒストグラムを作るプログラム
質問者:jkusjd 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;
}
困り度:
  • すぐに回答を!
質問投稿日時:
08/05/05 08:41
最新から表示回答順に表示

回答

ANo.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のままですよ。
回答者:php504
種類:回答
どんな人:一般人
自信:参考意見
回答日時:
08/05/07 10:02
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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 はすべてマクロに置き換えたほうが良いです。
(そうしないとマクロにする意味がない)
回答者:_himajin_
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/05 12:32
この回答への補足この回答に補足をつける(質問者のみ)
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

ANo.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]);
> }

このあたりの処理を行なっている点に問題があります。
回答者:asuncion
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:
08/05/05 11:46
この回答への補足ご指摘ありがとうございます。
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%F...
の濃淡ヒストグラムの作成を参考(ほぼそのままですが)に作成したのですが、
どこがいけないのかが分かりません。
教えていただけるとありがたいです。
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示