dポイントプレゼントキャンペーン実施中!

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
FILE *fpi, *fpo;
unsigned char idat;

/* 引数のチェック */
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, sizeof(unsigned char), 1, fpi) == 1){

/* 2倍の変換 */
if (idat * 2 > 255) {
idat = 255;
} else {
idat = idat * 2;
}

/* 変換データの書出し */
if(fwrite(&idat, sizeof(unsigned char), 1, fpo) != 1){
fprintf(stderr, "data write error\n");
exit(1);
}

}

fclose(fpi);
fclose(fpo);

return (0);
}

このプログラムをグレースケール化のプログラムに修正してください
お願いします

A 回答 (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などのケースもあり決まっていません。

この辺を明確にして質問されると、より正しい回答が得られるのではないかと
思います。

参考URL:http://ofo.jp/osakana/cgtips/grayscale.phtml

この回答への補足

補足します。
画像のフォーマットはPPMです。
グレースケール化の方法は
重み付けした輝度の計算で処理したいと思っています。
(0.299 * R + 0.587 * G + 0.114 * B)

必要な情報が抜けてすいませんでした

補足日時:2010/11/15 16:49
    • good
    • 0
この回答へのお礼

ありがとうございました。助かります

お礼日時:2010/11/15 22:21

追記。


あと、出力はPGM用のヘッダを付ける必要がありますね。
    • good
    • 0

PPMとあるけど、元もプログラムにはヘッダを読むところが無いですね。


変えてはいけないところまで変えてしまってます。

それさえ付けたして、計算をその重み付けに変えたら、#3さん
のプログラムでいいはず。




もっとも、既成の画像フォーマットなら、画像変換ツール使った方が楽だとは思うけど。
    • good
    • 0

質問ではなくて、プログラム作成依頼ですね…。


オープンソースのグラフィックライブラリ「OpenCV」http://opencv.jp/ を使うとグレイスケールも容易に出来ます。
頑張ってください。

この回答への補足

ありがとうございます。
でもOpenCVは使わない方向でお願いします

補足日時:2010/11/15 16:50
    • good
    • 0

200万ならやってもいいけど。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!