RGB→YUV変換を行っているのですが、
うまくいきません。
以下であっているのでしょうか?
//RGB > YUV変換
void RGBtoYUV(char *filename,int width,int height)
{
FILE *fpt,*fpt_output;
unsigned char *Input,*head;
unsigned char Y=0,U=0,V=0;
int i,j,b_flag=1;
int modification=0;
modification=width%4;
//ファイルのオープン
fopen_s(&fpt,filename,"rb");
if(fpt==NULL)
{
char DebugStr[256];
wsprintf(DebugStr,"%sが存在しません",filename);
MessageBox(NULL,DebugStr,"File Error",MB_OK);
}
else
{
fopen_s(&fpt_output,"YUV.bmp","wb");
//ヘッダ情報の書き込み
head=(unsigned char*)malloc(54);
fread(head,sizeof(unsigned char),54,fpt);
fwrite(head,sizeof(unsigned char),54,fpt_output);
free(head);
Input=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
//メモリに展開
for(i=0;i<height;i++)
{
fread(&Input[i*(3*width)],sizeof(unsigned char),3*width,fpt);
fseek(fpt,modification,SEEK_CUR);
}
fclose(fpt);//Inputファイルのクローズ
for(i=0;i<3*width*height;i+=3*width)
{
for(j=0;j<3*width;j+=3)
{
Y=(unsigned char)(0.299*Input[i+j+2]+0.587*Input[i+j+1]+0.114*Input[i+j]);
U=(unsigned char)(-0.169*Input[i+j+2]-0.3316*Input[i+j+1]+0.500*Input[i+j]);
V=(unsigned char)(0.500*Input[i+j+2]-0.4186*Input[i+j+1]-0.0813*Input[i+j]);
//Y
if(Y<0)
{
Input[i+j]=0x00;
}
else if(Y>255)
{
Input[i+j]=0xff;
}
else
{
Input[i+j]=Y;
}
//U
if(U<0)
{
Input[i+j+1]=0x00;
}
else if(U>255)
{
Input[i+j+1]=0xff;
}
else
{
Input[i+j+1]=U;
}
//V
if(V<0)
{
Input[i+j+2]=0x00;
}
else if(V>255)
{
Input[i+j+2]=0xff;
}
else
{
Input[i+j+2]=V;
}
}
}//i
fseek(fpt_output,54,SEEK_SET);
for(i=0;i<height;i++)
{
fwrite(&Input[3*width*i],sizeof(unsigned char),3*width,fpt_output);
//修正値の代入
for(j=0;j<modification;j++)
{
fwrite("\x000",sizeof(unsigned char),1,fpt_output);
}
}
fclose(fpt_output);
free(Input);
}
}
又 YUV→RGBにすると元の画像に戻らずに困っています。
プログラムに対するご指摘お願いします。
このプログラムはWindowGUIで幅と高さとファイル名を入力して
走らせるプログラムです。24bpp BMPが対象です。
No.1ベストアンサー
- 回答日時:
Y,U,Vの計算の仕方がまずいです。
unsigned charですと0~255の範囲の値しか取りませんので、
Y,U,Vが0~255の範囲外の場合オーバーフローが発生し正しい数値ではなくなるので、
shortやintなどの範囲の大きい変数に入れて計算し、丸め処理等を行う必要があります。
あとその計算式の場合Yの範囲は0~255ですが、U,Vの範囲は-128~127です。
今の処理だと、U,Vが0~255の範囲に丸められてしまいます。
あと、U,Vはsigned charの範囲(-128~127)なので、signed charとして処理してやるとかしないと、おかしくなると思います。
アドバイスありがとうございました。
web上を探して1つだけプログラムソースが見つかったのですが
それでもうまくいかなくて質問しました。
ご指摘ありがとうございました。
YUVのUVは範囲が-128~127だというのは初耳でした。
そうすると、画像処理ソフトではうまくさばけないんでしょうかね。
生で-100とか入れても?画像って表示されるのかな。
実験してみます。
いままでRGBで0~255しか扱ったことがなかったです。
画像処理ソフトもその値のピクセルを表示しているのかと
思っていました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- JavaScript プログラムがうまく動きませんレビューお願いします 1 2022/07/10 05:08
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- JavaScript コードレビューをお願いします。 1 2022/07/16 05:38
- その他(プログラミング・Web制作) 物理の斜方投射で目盛りに数値を入れたい 2 2023/05/27 06:32
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
- その他(プログラミング・Web制作) 物理の斜方投射の目盛り線とx軸、y軸の追加について 3 2023/05/26 21:11
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
間接参照のレベルが異なっています
-
for文 アスタリスクで形を作る
-
Win32APIでのエディットボック...
-
wParam
-
c++ 文字列を入力して、一文字...
-
new
-
文字列から空白を取り除きたい...
-
c言語strchrのキャスト...
-
char型配列について
-
OpenCVで32bit ヘッダ無しRaw画...
-
入力された文字列から整数だけ...
-
バイナリファイルをコピーする...
-
char型の比較
-
DPマッチング
-
c#でbmp画像の上下反転
-
double型の値をchar配列に変換...
-
main の引数には const 付けた方が
-
文字列
-
PING JPEGファイルのExif規格の...
-
プログラミングで以下の実行結...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
c++ 文字列を入力して、一文字...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
干支のプログラム
-
絶対パスからのファイル名の切...
-
3桁区切(コンマ)記号をつけ...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
【C言語】文字型と整数型の違い
おすすめ情報