質問 |
||
| 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... の濃淡ヒストグラムの作成を参考(ほぼそのままですが)に作成したのですが、 どこがいけないのかが分かりません。 教えていただけるとありがたいです。 |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |