• 締切済み

C言語でヒストグラムを作成するプログラムを作りたいのですが

C言語でヒストグラムを作成するプログラムを書いたのですが、正しい濃度値が出力されずに困っています。 ヘッダなしの2バイト画像データを読み込みヒストグラムを書き出すプログラムです。 gccを使っています。 よろしくお願いします。

みんなの回答

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

2バイト画像のバイトオーダーは確認されましたか Big Endian か Little Endian か

locker
質問者

お礼

ご回答ありがとうございます。 読み込む画像が1バイトの画像になってました。 1バイト毎読み込むように変えたらうまくいきました。 誠にありがとうございました。

  • yosi_yosi
  • ベストアンサー率35% (165/468)
回答No.1

それで具体的に質問したいことは何でしょう? これだけの情報だと、あなたの作ったプログラムが間違っているとしか答えようが無いと思いますが・・・

locker
質問者

補足

回答ありがとうございます。 下記のプログラムを作成したのですが、間違いがありますでしょうか? #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int main(int argc, char *argv[]) { char infile[256], histogramfile[256]; int mszx, mszy; short *inputimg; int *histogram; short max; int i; short bin_width,bin_num; FILE *fp; if (argc != 6) { printf("Usage: %s (入力画像ファイル) (ヒストグラムファイル) (画像サイズX) (画像サイズY) (区関数) \n", argv[0]); exit(0); } strcpy(infile,argv[1]); /*入力画像ファイル名をinfileに代入*/ strcpy(histogramfile,argv[2]); /*ヒストグラムファイル名をhistogramfileに代入*/ mszx = atoi(argv[3]); /*画像のx方向の画素数をmszxに代入*/ mszy = atoi(argv[4]); /*画像のy方向の画素数をmszyに代入*/ bin_width = atoi(argv[5]); /*区間の幅をbin_widthに代入*/ printf("INPUT ORIGINAL IMAGE = %s \n", infile); printf("Histogram FILE = %s \n", histogramfile); printf("size X = %d \n", mszx); printf("size Y = %d \n", mszy); printf("bin width = %d \n", bin_width); /*----------画像のメモリ領域確保 入力画像をメモリに記憶する領域を確保する.---------------*/ inputimg = (short*)malloc(mszx * mszy * sizeof(short)); /*-----------原画像読み込み ヘッダ無しの2バイト画像データファイルを読み込む.-------------*/ if((fp=fopen(infile,"rb")) == NULL) { printf("OPEN FAILED %s\n", infile); exit(0); } fread(inputimg, sizeof(short), mszx * mszy, fp); fclose(fp); /*------------データ区間数の設定 画像値の最大値を求めて区関数を設定する.----------*/ max = 0; for (i = 0; i < mszx * mszy; i++) { if ( inputimg[i] > max ){ max = inputimg[i]; } } printf("max = %d\n",max); bin_num = max / bin_width + 1; printf("bins num = %d\n",bin_num); /*-----------ヒストグラムのメモリ領域確保 ヒストグラムデータをメモリに記憶する領域を確保する.----------*/ histogram = (int*)malloc(bin_num * sizeof(int)); /*------------ヒストグラムの初期化 ヒストグラムのメモリ領域を0で初期化する.--------------*/ for (i = 0; i < bin_num; i++) { histogram[i] = 0; } /*-------------画像処理 (ヒストグラム作成)-------------*/ for (i = 0; i < mszx * mszy; i++) { histogram[ (short)( (float) inputimg[i] / (float) bin_width ) ] ++; } /*-------------ヒストグラム書き出し------------*/ if((fp=fopen(histogramfile,"wt")) == NULL) { printf("OPEN FAILED %s\n", histogramfile); exit(0); } fprintf(fp,"Histogram INPUT IMAGE %s \n",infile); for (i = 0; i < bin_num; i++) { fprintf(fp,"%d %d \n",i,histogram[i]); } fclose(fp); /*----------メモリ領域開放 確保していたメモリ領域を開放する.------------*/ free(inputimg); free(histogram); return 0; }