#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);
}
このプログラムをグレースケール化のプログラムに修正してください
お願いします
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
この回答への補足
補足します。
画像のフォーマットはPPMです。
グレースケール化の方法は
重み付けした輝度の計算で処理したいと思っています。
(0.299 * R + 0.587 * G + 0.114 * B)
必要な情報が抜けてすいませんでした
No.4
- 回答日時:
PPMとあるけど、元もプログラムにはヘッダを読むところが無いですね。
変えてはいけないところまで変えてしまってます。
それさえ付けたして、計算をその重み付けに変えたら、#3さん
のプログラムでいいはず。
もっとも、既成の画像フォーマットなら、画像変換ツール使った方が楽だとは思うけど。
No.2
- 回答日時:
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
double型の値をchar配列に変換...
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
charでの計算?
-
入力された文字列から整数だけ...
-
c言語の問題の説明、各所ごとに
-
Win32APIでのエディットボック...
-
バイトスワップをやりたい
-
C言語について
-
C言語 ミリ秒を日付に変換には
-
文字列ポインタを結合
-
atoi( ) の反対をやりたい
-
「char* p」と「char *p」は何...
-
テキストデータをそのままバイ...
-
制御の方法
-
int main()の・・・
-
c言語の文字列の逆順のプログラ...
-
3桁区切(コンマ)記号をつけ...
-
ftoa の作り方
-
文字列から空白を取り除きたい...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
str系関数を使わずに二つの文字...
-
間接操作のレベルとは
-
int main()の・・・
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
switch文で文字を比較すること...
-
double型の値をchar配列に変換...
-
テキストデータをそのままバイ...
-
Win32APIでのエディットボック...
-
干支のプログラム
-
コンパイルエラー invalid ope...
-
間接参照のレベルが異なっています
おすすめ情報