• ベストアンサー

16bppBMPの仕様について

環境 Windows7 VS2008 SP1 windows BMP の「16bpp」の仕様について質問です。 ​http://www5d.biglobe.ne.jp/~noocyte/Programming/Windows/BmpFileForm...​ によれば 16 最大 216 色.ビットマップデータの各 WORD が1画素を表す. と書かれているのですが、 これが本当だとして BGRは(B,G,R)=(5bit,5bit,5bit)で構成すればよいのでしょうか? 1bitはあまりです。 結果としては、 Windowsフォトビュワーやmspaintで 正常にみれればよいと考えています また、16bppの仕様がいまいちよくわかりません。 1)mspaintで24bppの画像を16bppで保存したもの 2)自分のプログラムで生成した16bpp画像 を比較すると、「ヘッダ部分」は全て合っているのですが、 「画像データ部分」が全く異なっています。 私は1lineが BGR(2byte)+BGR(2byte)+・・・・・・+修正値(4byteバウンダリ) だと思っているのですが 違うのでしょうか? ちなみに5bit 5bit 5bitをつめこむプログラムは以下です int i,j; int x=0,y=0; for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { Output[x+y]=((layer[i+j])|(layer[i+j+1]>>SHIFT_R_5)); Output[x+y+1]=(((layer[i+j+1]>>SHIFT_R_3)<<SHIFT_L_6))|(((layer[i+j+2]>>SHIFT_R_3)<<SHIFT_L_1)); y+=2; } x+=2*width; y=0; } 間違っていたらご指摘お願いします。 以上 よろしくおねがいします

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

  • ベストアンサー
回答No.3

 こんばんは。  http://msdn.microsoft.com/ja-jp/library/cc352308.aspx  「RGB555/RGB565」を明確にする為に、BITMAPINFOHEADER::biCompressionにBI_BITFIELDSを指定して、ビットフィールドを設定します。  いつの間にかBI_RGBでも可能になっているみたいですが、まぁ、指定しておいた方が良いと思います。    デバイスコンテキストを利用した変換は以下URLを参照。  http://oshiete1.goo.ne.jp/qa5180838.html  大体以下の様になります。参考程度に。 #include <stdio.h> #include <windows.h> #define _RGB555_ #ifdef _RGB555_ const DWORD RMASK = 0x7c00; const DWORD GMASK = 0x03e0; const DWORD BMASK = 0x001f; const int GreenFactor = 8; #define RGBWORD(r, g, b) (((r) << 10) | ((g) << 5) | (b)) #else const DWORD RMASK = 0xf800; const DWORD GMASK = 0x07e0; const DWORD BMASK = 0x001f; const int GreenFactor = 4; #define RGBWORD(r, g, b) (((r) << 11) | ((g) << 5) | (b)) #endif //パディングを含めた1行当たりのバイト数 static DWORD CalcScanLineByte(const DWORD w, const DWORD bpp) { return ((((bpp * w) + 31) / 32) * 4); } //ビットマップヘッダの初期化 static void InitHDR(LPBITMAPINFOHEADER p, long w, long h) { p->biSize = sizeof(*p); p->biPlanes = 1; p->biBitCount = 16; p->biCompression = BI_BITFIELDS; p->biWidth = w; p->biHeight= h; p->biSizeImage = ::CalcScanLineByte(p->biWidth, p->biBitCount) * p->biHeight; } //RGBフィールドの設定 static void InitFields(DWORD f[]) { f[0] = RMASK; f[1] = GMASK; f[2] = BMASK; } //確認 int main(void) { //テスト用の24bitイメージ static BYTE layer[99 * 97 * 3]; layer[0] = 255; layer[(99 * 1 * 3) - 2] = 255; layer[(99 * 97 * 3) - 1] = 255; int w = 99; int h = 97; //ビットマップ情報ヘッダ BYTE buf[sizeof(BITMAPINFOHEADER) + sizeof(DWORD) * 3]; BITMAPINFO* pBmi = reinterpret_cast<BITMAPINFO*>(buf); ::InitHDR(&pBmi->bmiHeader, w, h); ::InitFields(reinterpret_cast<DWORD*>(&pBmi->bmiColors)); //ビットマップファイルヘッダ BITMAPFILEHEADER bfi = {0}; bfi.bfType = 'B' | ('M' << 8); bfi.bfOffBits = sizeof(bfi) + sizeof(buf); bfi.bfSize = bfi.bfOffBits + pBmi->bmiHeader.biSizeImage; //割り当てと変換 LPBYTE pOut = static_cast<LPBYTE>(::calloc(pBmi->bmiHeader.biSizeImage, 1)); const int nStride = ::CalcScanLineByte(pBmi->bmiHeader.biWidth, pBmi->bmiHeader.biBitCount); for(int y = 0; y < h; ++y) { for(int x = 0; x < w; ++x) { const int dpos = (x * sizeof(WORD)) + (nStride * (h - y - 1)); const int spos = (x * 3) + (w * 3 * y); const int R = layer[spos] / 8; const int G = layer[spos + 1] / GreenFactor; const int B = layer[spos + 2] / 8; LPWORD pWord = reinterpret_cast<LPWORD>(&pOut[dpos]); *pWord = RGBWORD(R, G, B); } } //ファイルへ書き込み FILE* pf = ::fopen("test16bit.bmp", "wb"); if(pf == NULL)return 0; ::fwrite(&bfi, sizeof(bfi), 1, pf); ::fwrite(buf, sizeof(buf), 1, pf); ::fwrite(pOut, pBmi->bmiHeader.biSizeImage, 1, pf); ::fclose(pf); //後始末 ::free(pOut); return 0; }

ringist
質問者

お礼

こんばんは! 具体的なソースをだしてくれて 本当にありがとうございます。 かなり助かりました 本当にありがとうございます

その他の回答 (3)

  • penta1331
  • ベストアンサー率64% (16/25)
回答No.4

こんにちは。 16bitのフォーマットに関してのみですが、参考となれば。 たとえばPhotoshop(最新版ではないですが...)などでBMPフォーマットで保存すると、16bitでは以下の方式を選択可能です。 - X1 R5 G5 B5 →最上位1bit未使用、RGB各5bit - A1 R5 G5 B5 →最上位1bitがαチャンネル、RGB各5bit - R5 G6 B5 →R5bit、G6bit、B5bit - X4 R4 G4 B4 →上位4bit未使用、RGB各4bit - A4 R4 G4 B4 →上位4bitαチャンネル、RGB各4bit 私自身が調べた時も、情報が見つからなかったので実際の画像編集ソフトで使われているフォーマットを参考にした記憶があります。 使用するソフトが決まっているならそのソフトのフォーマットだけに絞って作成する方がいいと思います。 もう試しているかも知れませんが、「R255 G0 B0」「R0 G255 B0」「R0 G0 B255」のようなファイルを作れば、ビット構成も推測できると思います。 αチャンネルについては、ビットマップではほとんど使われていないと思います。参考データを探すほうが難しい?

ringist
質問者

お礼

こんばんは! 具体的な調査方法などを伝授していだだき ありがとうございました。!

回答No.2

RGB16の2バイトの構成は以下 0x7C00 (0111 1100 0000 0000) <-赤のマスク 0x03E0 (0000 0011 1110 0000) <-緑のマスク 0x001F (0000 0000 0001 1111) <-青のマスク 最上位1ビットは未使用。 カラーテーブルを使う場合は、また別になるはずです。 あとはご自身で・・。

ringist
質問者

お礼

仕様をおしえてくださりありがとうございました! 助かりました!

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

(画像が入っていると思われる)layerの定義、添字の意味、各要素の仕様は? Outputはunsigned charの配列ですか? (マクロと思われる)SHIFT_R_5,SHIFT_R_3....の定義は? 同サイトの下の方、「5.ビットマップデータ」には ・biCompression=BI_RGB の場合 LSB から順に5ビットずつ,B,G,R の輝度を表す.MSB は未使用. とあります 幅widthの画像で、座標(列,行)が layer[ 行 * width *3 + 列 * 3 ] : Blue 5bit layer[ 行 * width *3 + 列 * 3 +1] : Green 5bit layer[ 行 * width *3 + 列 * 3 +2] : Red 5bit となっていて #define SHIFT_R_5 5 のように、最後の数字がそのまま定義されているとすると > Output[x+y]=((layer[i+j])|(layer[i+j+1]>>SHIFT_R_5)); layer[i+j+1]>>SHIFT_R_5 は5bitしかないデータを右に5bitシフトするので常に「0」になります。つまり、この文は > Output[x+y]=(layer[i+j]); と同じです。シフト方向が逆ではないでしょうか Output[x+y]=(((layer[i+j])|(layer[i+j+1]<<SHIFT_R_5))) & 0xff ; (念のため、 & 0xff を付けました) >Output[x+y+1]=(((layer[i+j+1]>>SHIFT_R_3)<<SHIFT_L_6))|(((layer[i+j+2]>>SHIFT_R_3)<<SHIFT_L_1)); layer[i+j+1]>>SHIFT_R_3 で5bit中の上位2bitが残り、それを左に6bitシフトしています。 Greenを g4 g3 g2 g1 g0という5bitだとすると g4 g3 0 0 0 0 0 0 となります。 (((layer[i+j+2]>>SHIFT_R_3)<<SHIFT_L_1))も同様に 0 0 0 0 0 r4 r3 0 となります。これらの | をとれば g4 g3 0 0 0 r4 r3 0 前の行は(修正したなら) g2 g1 g0 b4 b3 b2 b1 b0 ですから、r2 r1 r0 がありません。 >>SHIFT_R_3が余分だと考えれば (layer[i+j+2] <<SHIFT_L_1) は 0 0 r4 r3 r2 r1 r0 0 となり、 | の計算結果は g4 g3 r4 r3 r2 r1 r0 0 で、全ビットが入りました。しかし、これを16bitに並べると、リトルエンディアンなのでOutput[x+y+1],Output[x+y]の順になり g4 g3 r4 r3 r2 r1 r0 0. g2 g1 g0 b4 b3 b2 b1 b0 となります。これでは Gが分断されいるし、0も変な場所にあります。欲しいのは 0 r4 r3 r2 r1 r0 g4 g3 であり、それぞれの色に分解すれば 0 0 0 0 0 0 g4 g3 0 r4 r3 r2 r1 r0 0 0 なのですから、Greenは右に3bitシフトしたもの、Redは左に2bitシフトしたものです Output[x+y+1]=(layer[i+j+1]>> 3)| (layer[i+j+2]<<2); もう少しすっきりさせるなら、先に16bitにしてから、8bitずつ取り出すとよいでしょう int bpp16 ; /* 16bit計算用の変数: unsigned shortで十分だけど、どうせintで計算されるのだから */ とでもしておいて /* R <<10(=5+5) | G << 5 | B */ bpp16 = ( layer[i+j+2] << 10 ) | ( layer[i+j+1] << 5 ) | layer[i+j] ; Output[x+y] = bpp16 & 0xff ; Output[x+y+1] = (bpp16 >> 8) & 0xff ; --- 以下余談 ・Outputはそのまま出力するのでしょうか? 横方向のバイト数は4の倍数でないといけません。 このプログラムではwidthが奇数のときにおかしくなります。 width_step = (( width * 2 + 3)/ 4) * 4 ; と4の倍数に切り上げた変数を用意して Outputのサイズを height * width_step に x+=2*width; を x+=width_step ; にします。 ・変数の命名は自由と言えば自由ですが、普通は 横方向: x, width 縦方向: y, height を使います。 最初質問のプログラムを見たとき、縦横を入れ替えているのかと思いました。

ringist
質問者

お礼

こんばんは! 具体的なソースをだしてくれて大変助かりました また、指摘もありがとうございました。 プログラミングする上で気をつける様にします。 Outputはunsigned charの配列です layerもunsigned charです int i #define SHIFT_R_5 5 の様にしています。 ご教授 ご指摘ありがとうございました!

関連するQ&A

  • 1bppファイルを8bpp(raw)に変換する。

    環境 Windows7 VS2008 SP1 1bppの画像を8bppに変換しようとしているのですが うまくいきません。自分ではこれで 合っていると思うのですが・・・ 何かアドバイスお願いしますm(__)m int Main1bppTo8bpp(WCHAR *filename,int width,int height) { //width,heightは8bppになったときの幅,高さを指定する。 FILE *fpt; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"1bppTo8bpp Error",L"1bppTo8bpp Error",MB_OK); return -1; } else { unsigned char *layer,*Output; layer=(unsigned char*)calloc(((width/8)+1)*height*sizeof(unsigned char),sizeof(unsigned char)); Output=(unsigned char*)malloc(width*height); //読み込み fread(&layer[0],sizeof(unsigned char),((width/8)+1)*height,fpt); FILE *fpt_output; _wfopen_s(&fpt_output,L"1bppTo8bpp.raw",L"wb"); int i,j,flag=0x00; for(i=0;i<((width/8)+1)*height;i+=((width/8)+1)) { for(j=0;j<((width/8)+1);j++) { //8bit目 if((layer[i+j]&BIT8)==BIT8) { Output[i+j+flag]=0x00; } else { Output[i+j+flag]=0xff; } //7bit目 if((layer[i+j]&BIT7)==BIT7) { Output[i+j+flag+1]=0x00; } else { Output[i+j+flag+1]=0xff; } //6bit目 if((layer[i+j]&BIT6)==BIT6) { Output[i+j+flag+2]=0x00; } else { Output[i+j+flag+2]=0xff; } //5bit目 if((layer[i+j]&BIT5)==BIT5) { Output[i+j+flag+3]=0x00; } else { Output[i+j+flag+3]=0xff; } //4bit目 if((layer[i+j]&BIT4)==BIT4) { Output[i+j+flag+4]=0x00; } else { Output[i+j+flag+4]=0xff; } //3bit目 if((layer[i+j]&BIT3)==BIT3) { Output[i+j+flag+5]=0x00; } else { Output[i+j+flag+5]=0xff; } //2bit目 if((layer[i+j]&BIT2)==BIT2) { Output[i+j+flag+6]=0x00; } else { Output[i+j+flag+6]=0xff; } //1bit目 if((layer[i+j]&BIT1)==BIT1) { Output[i+j+flag+7]=0x00; } else { Output[i+j+flag+7]=0xff; } flag=flag+8; } flag=0x00; } //最終的な「fwrite」はここでする。 fwrite(&Output[0],sizeof(unsigned char),width*height,fpt_output); free(layer); free(Output); fclose(fpt); fclose(fpt_output); } return 0;

  • 放射状ブラー C言語で書いたのですが結果がうまくいっていない

    こんばんは! Windows環境,VS2005で放射状ブラーを以下の様に書きましたが、 結果が添付ファイルの様になってしまい、うまくいきません。 コンパイルは通り実行もできるのですが、結果がうまくいっていないのです。(いろんな画像で試しましたが明らかに うまくいっていない気がするのです) 参考にしたのは、 http://www.sbcr.jp/books/download/art.asp?newsid=2198 の " 第3章 エフェクト処理の応用(その1) IPP_Chap3a.zipの中にある list3_14.cです。 又、web上では、http://d.hatena.ne.jp/matsu4512/20090726/1248575190 参考にしました。 以下が私が書いたものです。Input=24bppのrawファイル名 幅、高さが入った構造体です。 プログラミング思想としては、1次元配列で画像を表しています。 #define NN 17 #define NF 8 int Main24bppToRadialBlur(COMMONDATA *Common_Data_Raw) { FILE *fpt; FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; int i; unsigned char *layer,*img_output; int rr,gg,bb,oo; int x1=0; int y1=0; int x2=3*width-3; int y2=3*width*height-3*width; WCHAR DebugStr[256]; double ox,oy; ox=(double)(x2-x1)/2.0; oy=(double)(y2-y1)/2.0; double dx,dy; dx=(double)x2-ox; dy=(double)y2-oy; double disMAX; disMAX=sqrt(dx*dx+dy*dy); int x,y; int xx,yy; double rate,rad=0,dis,disI; int pat_sum,pat; double ef=30.0; _wfopen_s(&fpt,Common_Data_Raw->filename,L"rb"); layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //読み込み fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); img_output=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); //◆画像処理をするスペース for(y=y1;y<=3*width*height-3*width;y+=3*width) { for(x=x1;x<=3*width-3;x+=3) { rr=gg=bb=oo=0; dx=(double)x-ox; dy=(double)y-oy; if(dx!=0.0) { rad=atan(dy/dx); } else { rad=3.14159265/2.0; } //rad+=(3.14159265/2.0); dis=sqrt(dx*dx+dy*dy); rate=ef*dis/disMAX; rate/=((double)NF); pat_sum=0; for(i=0;i<NN;i++) { if(i==NF) { pat=3; } else { pat=1; } disI=(double)(i-NF)*rate; xx=(int)(disI*cos(rad))+x; yy=(int)(disI*sin(rad))+y; rr+=layer[xx+yy] * pat; gg+=layer[xx+yy+1]* pat; bb+=layer[xx+yy+2]* pat; oo+= pat; pat_sum+=pat; } img_output[x+y]=rr/(oo); img_output[x+y+1]=gg/(oo); img_output[x+y+2]=bb/(oo); }//x }//y _wfopen_s(&fpt_output,L"RGBToRadialBlur.raw",L"wb"); fwrite(&img_output[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(img_output);

  • RGBをCMYKに変換するプログラム

    Windows7 VS2008 SP1 RGBからCMYKに変換するプログラムを以下の様に書いている ([詳解]画像処理プログラミング という本に載っている ソースです) のですがうまくいきません。 おそらく型の扱い??だと思うのですが・・ 具体的にどの部分を修正すればいいのかご指摘お願いします。 INPUT:24bpp raw int RawToCMYK(WCHAR *filename,int width,int height) { FILE *fpt; FILE *fpt_C,*fpt_M,*fpt_Y,*fpt_K; unsigned char *layer; unsigned char *C,*M,*Y,*K; int i,j; _wfopen_s(&fpt,filename,L"rb"); if(fpt==0x00) { MessageBox(NULL,L"RawToCMYK Error",L"RawToCMYK Error",MB_OK); return -1; } else { layer=(unsigned char*)malloc(3*width*height); C=(unsigned char *)malloc(width*height); M=(unsigned char *)malloc(width*height); Y=(unsigned char *)malloc(width*height); K=(unsigned char *)malloc(width*height); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); fclose(fpt); _wfopen_s(&fpt_C,L"RawToC.raw",L"wb"); _wfopen_s(&fpt_M,L"RawToM.raw",L"wb"); _wfopen_s(&fpt_Y,L"RawToY.raw",L"wb"); _wfopen_s(&fpt_K,L"RawToK.raw",L"wb"); for(i=0;i<3*width*height;i+=3*width) { for(j=0;j<3*width;j+=3) { C[i/3+j/3]=255-layer[i+j]; M[i/3+j/3]=255-layer[i+j+1]; Y[i/3+j/3]=255-layer[i+j+2]; K[i/3+j/3]=min3(C[i/3+j/3],M[i/3+j/3],Y[i/3+j/3]); if(K[i/3+j/3]==0xff) { C[i/3+j/3]=0x00; M[i/3+j/3]=0x00; Y[i/3+j/3]=0x00; } else { C[i/3+j/3]=(C[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); M[i/3+j/3]=(M[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); Y[i/3+j/3]=(Y[i/3+j/3]-K[i/3+j/3])*255/(255-K[i/3+j/3]); } } } fwrite(&C[0],sizeof(unsigned char),width*height,fpt_C); fwrite(&M[0],sizeof(unsigned char),width*height,fpt_M); fwrite(&Y[0],sizeof(unsigned char),width*height,fpt_Y); fwrite(&K[0],sizeof(unsigned char),width*height,fpt_K); fclose(fpt_C); fclose(fpt_M); fclose(fpt_Y); fclose(fpt_K); free(C); free(M); free(Y); free(K); return 0;

  • RGB→YUV変換のプログラム

    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が対象です。

  • C言語による間引き拡大縮小

    http://csharpimage.blog60.fc2.com/blog-entry-18.html をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、 rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。 24bppのRawファイル(RGB)を拡大縮小しようとしています。 rescale[i+j] =layer[(int)xpos+(int)ypos];の layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。 layer:24bppRawを読み込むメモリ アドバイスお願い致します。m(___)m FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale; int hySize=Common_Data_Raw->height_rescale; // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)xSize / hxSize; double hokanY = (double)ySize / hySize; unsigned char *layer,*rescale; //読み込み layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); //拡大縮小後のサイズ rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char)); ypos = 0.0; for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize) { xpos = 0.0; for (int j=0;j<3*hxSize;j+=3) { // 単純補間・間引き rescale[i+j] =layer[(int)xpos+(int)ypos]; rescale[i+j+1]=layer[(int)xpos, (int)ypos]; rescale[i+j+2]=layer[(int)xpos, (int)ypos]; xpos += hokanX; } ypos += hokanY; } _wfopen_s(&fpt_output,L"output.raw",L"wb"); fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(rescale); return 0;

  • YUV⇔RGB変換がうまくいきません。

    24bppRaw(R,G,Bの順番)を以下の式でYUVに変換します。 layer[i+j]がRでlayer[i+j+1]がGでlayer[i+j+2]がBです。 Y=(unsigned char)(0.257*layer[i+j]+0.504*layer[i+j+1]+0.098*layer[i+j+2]+16); U=(unsigned char)(-0.148*layer[i+j]-0.291*layer[i+j+1]+0.439*layer[i+j+2]+128); V=(unsigned char)(0.439*layer[i+j]-0.368*layer[i+j+1]-0.071*layer[i+j+2]+128); そのあとにYUVをRGBのrawに以下の式で変換します。 Y=layer[i+j]; U=layer[i+j+1]-128; V=layer[i+j+2]-128; R=(unsigned char)(1.164*(Y-16)+1.596*V); B=(unsigned char)(1.164*(Y-16)+2.018*U); G=(unsigned char)(1.164*(Y-16)-0.391*U-0.813*V); しかし元のRGBにはならず画像がおかしくなります。 もちろんオーバーフロー、アンダーフローなどは丸めています。 どのような式を用いれば、RGB⇔YUV 相互変換ができるのが ご教授ください。もう半年くらい随分迷っています。 ダイレクトに式だけ提示いただけるだけで結構なので よろしくおねがいいたしますm(___)m 参考HP http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html http://www.sm.rim.or.jp/~shishido/yuv.html

  • grad(1/r)を求める問題で

    位置ベクトルrがr=ix+jy+kzのとき、grad(1/r)を求めよ。ただしi,j,kは直交座標系の単位ベクトルとする。 grad(1/r)=i(∂(r^-1)/∂x)+j(∂(r^-1)/∂y)+k(∂(r^-1)/∂z) =i(∂(1/(x+y+z))/∂x)+j(∂(1/(x+y+z))/∂y)+k(∂(1/(x+y+z))/∂z) =-i(1/r^2)-j(1/r^2)-k(1/r^2) =-(i+j+k)/r^2 というように導出してしまったのですが、これで良いのでしょうか。 どうも、1/r=1/(x+y+z)と捉えてしまっているのが腑に落ちないのですが… 是非、お教えください。お願いします。

  • ルベーグ測度,直積測度の零集合

    I,Jをユークリッド空間R^m,R^nの部分ルベーグ有限測度空間とします。 φ(x,y)(x∈I,y∈J)を論理式とします。 「φ(x,y)  a.e ((x,y)∈I×J)」 ならば 「「φ(x,y)  a.e (x∈I) 」 a.e (y∈J)」 は成り立ちますか。また、成り立たない場合はどのような反例がありますか。 但し、I×JはIとJの直積測度空間です。 全くわからないので、よろしくお願いします。

  • ヘリカル仕様で無いマシンですが。

    お陰様で、現状は、小径の穴から大径まで、問題無く作動しています。が、G11とBHCを併用すると、ダメみたいです。解決できますか?下記が、プログラム例です。 T13 M6 G15 H1 G11 P-0.258 X377 Y0 G56 Z100H13 S1500 M3 M8 MODIN OR23 CALL O23 MODOUT G0 Z30 MODIN OR24 CALL O24 MODOUT G0 Z500 M9 M5 G10 G15 H11 X0 Y600 M01 G15 H1 M63 M6 M2 / O23 OMIT R1 R5 R6 R7 BHC X0 Y0 I200 J0 K10 RTS O24 OMIT R2 R3 R4 R8 R9 R10 BHC X0 Y0 I200 J0 K10 RTS / ヘリカルのサブですが、この前、指南頂いたのです。 OR23 XC=VROCOX~(文字数の制限で以下省略) 角度の計算が、3段階で入るので、機械の処理速度が付いてこないのでしょうか?機械は、ヘリカルのオプション無しのOKUMA、OSP7000Mです。

  • 統計学

    どうしても分からないので教えて欲しいと思います。 問題は、 「離散型確率変数X,Yの分布はP(X=xi)=pi(i=1,2)   P(Y=yi)=qi(i=1,2)である。(1)P(X=xi,Y=yj)=rij(i,j=1,2)とするとき、 ri1+ri2=pi(i=1,2) r1j+r2j=qj (j=1,2) が成立することを示せ。」です。 再提出となった自分のレポートは、  まず、x1とx2の確率(p1, p2とする)の合計が1になる表と、同様にy1とy2の確率(q1,q2とする)の合計が1となる表をかきました。  次に、iとjの組み合わせについて、(xi, yi)とrijとの対応する表をかき、 r11+r12=p1 ((1)とする) r21+r22=p2 ((2)とする) r11+r21=q1 ((3)とする) r12+r22=q2 ((4)とする)を導き、 (1)、(2)より、ri1+ri2=pi (i=1,2) (3)、(4)より、r1j+r2j=qj (j=1,2) したがって、ri1+ri2=pi (i=1,2) r1j+r2j=qj (j=1,2) が示せた。 と書いて出した所、 「文中の表は(ⅰ)P(X=xi,Y=y1)+P(X=xi,Y=y2)=pi(i=1,2) (ⅱ)P(X=x1,Y=yj)+P(X=x2,Y=yj)=qj (j=1,2) が成立することを前提にして作った表です。(ⅰ)、(ⅱ)の等式の成立を証明して下さい。」   と書かれて再提出でした。(ⅰ)、(ⅱ)の等式の成立の証明なんですが、いくら考えても出来ません。どなたかアドバイスお願いします。