• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の質問です)

C言語での画像のグレースケール化プログラム修正

このQ&Aのポイント
  • C言語で画像のグレースケール化を行うプログラムを修正する方法について説明します。
  • プログラムでは、入力画像をオープンし、ピクセルごとに2倍の変換を行い出力画像に書き込む処理を行っています。
  • 修正する際には、ピクセルの色情報をRGBからグレースケールに変換する処理を追加する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjk65536
  • ベストアンサー率59% (66/111)
回答No.3

最低限必要な情報が足りていません。 入力画像のフォーマットはなんでしょうか? グレースケール化のアルゴリズムは何? ここでは、”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
spliggun
質問者

お礼

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

spliggun
質問者

補足

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

その他の回答 (4)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

PPMとあるけど、元もプログラムにはヘッダを読むところが無いですね。 変えてはいけないところまで変えてしまってます。 それさえ付けたして、計算をその重み付けに変えたら、#3さん のプログラムでいいはず。 もっとも、既成の画像フォーマットなら、画像変換ツール使った方が楽だとは思うけど。

  • g_liar
  • ベストアンサー率52% (382/728)
回答No.2

質問ではなくて、プログラム作成依頼ですね…。 オープンソースのグラフィックライブラリ「OpenCV」http://opencv.jp/ を使うとグレイスケールも容易に出来ます。 頑張ってください。

spliggun
質問者

補足

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

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

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

関連するQ&A