- ベストアンサー
C言語での画像のグレースケール化プログラム修正
- C言語で画像のグレースケール化を行うプログラムを修正する方法について説明します。
- プログラムでは、入力画像をオープンし、ピクセルごとに2倍の変換を行い出力画像に書き込む処理を行っています。
- 修正する際には、ピクセルの色情報をRGBからグレースケールに変換する処理を追加する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
最低限必要な情報が足りていません。 入力画像のフォーマットはなんでしょうか? グレースケール化のアルゴリズムは何? ここでは、”24bitカラー”で”単純平均法”を使ったグレー化について考えてみます。 Red Green Blue Red Green Blue …の順に1色1バイトで3色(3バイト)で1ドットです。 単純平均法では、r+g+b/3でグレー値を求めます。 この前提で修正すると、以下のような感じでしょうか。 #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { FILE *fpi, *fpo; unsigned char idat[3]; unsigned char odat; int sum; /* 引数のチェック */ if (argc != 3) { fprintf(stderr, "Usage: %s [input] [output]\n", argv[0]); exit(1); } /* 入力画像のオープン */ if((fpi=fopen(argv[1], "rb")) == NULL){ fprintf(stderr, "input file open error\n"); exit(1); } /* 出力画像のオープン */ if((fpo=fopen(argv[2], "wb")) == NULL){ fprintf(stderr, "output file open error\n"); exit(1); } /* 入力画像の読込み */ while (fread(idat, 3, 1, fpi) == 1){ /* グレー化 */ sum = idat[0] + idat[1] + idat[2]; odat = (unsigned char)(sum / 3); /* 変換データの書出し */ if(fwrite(&odat, sizeof(unsigned char), 1, fpo) != 1){ fprintf(stderr, "data write error\n"); exit(1); } } fclose(fpi); fclose(fpo); return (0); } グレースケール化にはいくつも方法があります。 参照URLに解説サイトのURLを貼っておきましたので、そこをみて 修正されることをお勧めします。 また、カラーデータもフォーマットは無限に近く存在します。 アルファチャネルをもってrgbargba…と並ぶものや、16ビットでr(5bit)b(6bit)g(5bit)と 表現するものなど。 8bitでパレットデータを併せ持つのも一般的ですよね。 並びもrgbではなくbgrなどのケースもあり決まっていません。 この辺を明確にして質問されると、より正しい回答が得られるのではないかと 思います。
その他の回答 (4)
- kmee
- ベストアンサー率55% (1857/3366)
追記。 あと、出力はPGM用のヘッダを付ける必要がありますね。
- kmee
- ベストアンサー率55% (1857/3366)
PPMとあるけど、元もプログラムにはヘッダを読むところが無いですね。 変えてはいけないところまで変えてしまってます。 それさえ付けたして、計算をその重み付けに変えたら、#3さん のプログラムでいいはず。 もっとも、既成の画像フォーマットなら、画像変換ツール使った方が楽だとは思うけど。
- g_liar
- ベストアンサー率52% (382/728)
質問ではなくて、プログラム作成依頼ですね…。 オープンソースのグラフィックライブラリ「OpenCV」http://opencv.jp/ を使うとグレイスケールも容易に出来ます。 頑張ってください。
補足
ありがとうございます。 でもOpenCVは使わない方向でお願いします
- SaKaKashi
- ベストアンサー率24% (755/3136)
200万ならやってもいいけど。
お礼
ありがとうございました。助かります
補足
補足します。 画像のフォーマットはPPMです。 グレースケール化の方法は 重み付けした輝度の計算で処理したいと思っています。 (0.299 * R + 0.587 * G + 0.114 * B) 必要な情報が抜けてすいませんでした