• 締切済み

MatlabによるRGB空間からYUV空間への変更について.

現在Matlabを勉強中の者です. 160*120ピクセルの画像の色空間を RGBからYUV(YCbCr)へ変換するプログラムを考えているのですが, 以下のソースコードで大まかな点はあっているでしょうか? 実際にYUVへ変換後,画像を表示したところ, 元画像とは色調が変わってしまい頭を抱えています. 画像を表示する際のカラーマップに問題があるのでしょうか. ご教授お願い致します. % 画像ファイルの読込 pictureRgb = imread('./data/gazou0.bmp'); pictureYcbcr = imread('./data/gazou0.bmp'); % YCbCr空間(フルレンジ)への変換 pictureYcbcr(:,:,1) = uint8(0.257 * double(pictureRgb(:,:,1)) + 0.504 * double(pictureRgb(:,:,2))... + 0.098 * double(pictureRgb(:,:,3))+16.0); pictureYcbcr(:,:,2) = uint8(-0.148 * double(pictureRgb(:,:,1)) - 0.291 * double(pictureRgb(:,:,2))... + 0.439 * double(pictureRgb(:,:,3))+128.0); pictureYcbcr(:,:,3) = uint8(0.439 * double(pictureRgb(:,:,1)) - 0.368 * double(pictureRgb(:,:,2))... + 0.071 * double(pictureRgb(:,:,3))+128.0); %R成分の表示 subplot(3,3,1); image(pictureRgb(:,:,1)); axis image; axis off; title('R 成分'); %G成分の表示 subplot(3,3,2); image(pictureRgb(:,:,2)); axis image; axis off; title('G 成分'); %B成分の表示 subplot(3,3,3); image(pictureRgb(:,:,3)); axis image; axis off; title('B 成分'); %--------------------------- %Y成分の表示 subplot(3,3,4); image(pictureYcbcr(:,:,1)); axis image; axis off; title('Y 成分'); %Cb成分の表示 subplot(3,3,5); image(pictureYcbcr(:,:,2)); axis image; axis off; title('Cb成分'); %Cr成分の表示 subplot(3,3,6); image(pictureYcbcr(:,:,3)); axis image; axis off; title('Cr成分'); %--------------------------- %原画像の表示 subplot(3,3,7); image(pictureRgb); axis image; axis off; title('元画像'); %YUV画像の表示 subplot(3,3,8); image(pictureYcbcr); axis image; axis off; title('YUV画像');

この投稿のマルチメディアは削除されているためご覧いただけません。

みんなの回答

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

Matlabはよく知らないのでそれについては分かりませんが 添付画像見る限り原画のRGB分離自体もまともに出来てないのでは?と思いますけど (普通グレー(白黒濃淡)画像にならないとおかしいと思うんですがなぜ青とか茶色???)

e0652251
質問者

お礼

回答ありがとうございます. Matlabの仕様で,濃淡を「低い値程青く,高い値程赤に近い」 というモードで表示されていたので colormap(gray); というコマンドを追加すると白黒濃淡の画像で表示できました. 画像を張り直そうとしたのですが,画像の投稿は一度切りのようですね. 困りました…苦笑

関連するQ&A

  • RGBからYUVへの変換(Matlab)についての質問です.

    先ほども質問させていただきましたが, 画像に誤りがあった為再度投稿させていただきます. 貴重なスペースを無駄に使用してしまい大変申し訳ありません. >> 現在Matlabを勉強中の者です. 160*120ピクセルの画像の色空間を RGBからYUV(YCbCr)へ変換するプログラムを考えているのですが, 以下のソースコードで大まかな点はあっているでしょうか? 実際にYUVへ変換後,画像を表示したところ, 元画像とは色調が変わってしまい頭を抱えています. 画像を表示する際のカラーマップに問題があるのでしょうか. ご教授お願い致します. % 画像ファイルの読込 pictureRgb = imread('./data/gazou0.bmp'); pictureYcbcr = imread('./data/gazou0.bmp'); % YCbCr空間(フルレンジ)への変換 pictureYcbcr(:,:,1) = uint8(0.257 * double(pictureRgb(:,:,1)) + 0.504 * double(pictureRgb(:,:,2))... + 0.098 * double(pictureRgb(:,:,3))+16.0); pictureYcbcr(:,:,2) = uint8(-0.148 * double(pictureRgb(:,:,1)) - 0.291 * double(pictureRgb(:,:,2))... + 0.439 * double(pictureRgb(:,:,3))+128.0); pictureYcbcr(:,:,3) = uint8(0.439 * double(pictureRgb(:,:,1)) - 0.368 * double(pictureRgb(:,:,2))... + 0.071 * double(pictureRgb(:,:,3))+128.0); %R成分の表示 subplot(3,3,1); image(pictureRgb(:,:,1)); axis image; axis off; title('R 成分'); %G成分の表示 subplot(3,3,2); image(pictureRgb(:,:,2)); axis image; axis off; title('G 成分'); %B成分の表示 subplot(3,3,3); image(pictureRgb(:,:,3)); axis image; axis off; title('B 成分'); %--------------------------- %Y成分の表示 subplot(3,3,4); image(pictureYcbcr(:,:,1)); axis image; axis off; title('Y 成分'); %Cb成分の表示 subplot(3,3,5); image(pictureYcbcr(:,:,2)); axis image; axis off; title('Cb成分'); %Cr成分の表示 subplot(3,3,6); image(pictureYcbcr(:,:,3)); axis image; axis off; title('Cr成分'); %--------------------------- %原画像の表示 subplot(3,3,7); image(pictureRgb); axis image; axis off; title('元画像'); %YUV画像の表示 subplot(3,3,8); image(pictureYcbcr); axis image; axis off; title('YUV画像');

  • MATLAB:多数の画像を取り込み、その平均画像を表示させたい。

     現在、顔画像認証についてMatlabで試行錯誤している者です。  試作として以下に挙げる簡単なものは自作できたのですが、 データをさらに複数取り込みたいので、このような表記法だと、 後々手書きでは追いつかなくなってしまいます。 また、事象ごとに取り込む数が違うので、このままでは 1回の試行につき、ひとつ作っていかなければなりません。  質問は、こういったコードをどのようにまとめたらよいのか、です。 for文を使うことまでは理解したのですが、 具体的な書き方がまったく解らないので、ご教授願えないでしょうか。 k1 = imread( 'sample01.bmp' ); k2 = imread( 'sample02.bmp' ); k3 = imread( 'sample03.bmp' ); k4 = imread( 'sample04.bmp' ); k5 = imread( 'sample05.bmp' ); k6 = imread( 'sample06.bmp' ); k7 = imread( 'sample07.bmp' ); k8 = imread( 'sample08.bmp' ); k9 = imread( 'sample09.bmp' ); k10 = imread( 'sample10.bmp' ); colormap(gray(256)); k1 = double(k1); k2 = double(k2); k3 = double(k3); k4 = double(k4); k5 = double(k5); k6 = double(k6); k7 = double(k7); k8 = double(k8); k9 = double(k9); k10 = double(k10); heikin = (k1+k2+k3+k4+k5+k6+k7+k8+k9+k10)/10; image(heikin);

  • MATLABで画像のヒストグラムを表示させようとしています。

    MATLABで画像のヒストグラムを表示させようとしています。 >> I=imread('img.tif'); >> imhist(I) ??? Undefined function or method 'imhist' for input arguments of type 'uint8'. というエラーが返ってくるのですが、どうしたらいいのでしょうか? >>

  • MATLABで二次元フーリエ変換

    画像処理のプログラムを作成しています。参考にしている参考書は【最新MATLABハンドブック】という本です。この本を参考にして、一次元フーリエ変換のプログラムから画像処理の二次元フーリエ変換のプログラムに変更させたいのですが、fft2のところでエラーが出てしまいます。自分なりにプログラムを書き直してみたのですが、fft→fft2に関数変更する以外にもっと根本的なことが必要なのでしょうか? 作成したプログラムはこれです。 clear;close all;n=256;dt=0.005; t=((1:n)-1)*dt; f=t/dt/dt/n;n2=n/2;n2p1=n2+1; X=imread('001.bmp'); X=rgb2gray(X); X=double(X); [m,n]=size(X); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %calc corresponding index number F=50; index=round(F*dt*n+1);index1=(index-1):(index+1); index2=n+2-index1; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %band elminate filter befil=ones(size(X)); befil(index1)=zeros(size(index1)); befil(index2)=zeros(size(index2)); Y=fft2(X);    ←ここでエラーが出ます。 subplot(2,2,1) plot(f,abs(Y)/n2,'r');axis([0 f(n2p1) 0 1]) xlabel('Frequency (Hz)'),ylabel('Magnitude'); title('Original Signal in freq domain'); %%Now apply fft filter in freq domain fftX=fftX.*befil; subplot(2,2,3) plot(f,abs(Y)/n2,'r');axis([0 f(n2p1) 0 1]) xlabel('Frequency (Hz)'),ylabel('Magnitude'); title('filtered Signal in freq domain'); subplot(2,2,2) imaagesc(X),colormap(gray),axis tight; subplot(2,2,4) imagesc(real(ifft2(Y))),colormap(gray),axis tight; 画像の一部分の情報のみを欠落させたいのです。そのためにはバンドエルミネーションフィルタと思ったのですが…もし違うようならご指摘をお願いします。ちなみに001.bmpはカラー画像です。

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

  • MATLABのGUI、画像表示について

    GUIDEで設計したGUIのaxes1に画像を表示させようとしているのですが、 simulink上のMファイルに a = imread('a.jpg'); image(a); のようにimageを記述して、GUI上のオブジェクトを指定するにはどうしたらよいのでしょうか?? 新たにfigureを立ち上げるのではなく、GUIに表示させる方法がわからず困っています。 初心者なのでわからないことだらけですが、よろしくお願いします!

  • 家庭用のプリンタでRGB画像の色に近づけて印刷したいのですが

    画像を印刷すると画面では青緑系の色がほとんど緑色になってしまいます。そこでepsに変換して印刷してみたのですが、うまくいきませんでした。 bmpをEPS-convで圧縮なしのepsに変換、LaTeXで下記のように画像を入れました。 \documentclass[a5paper]{jsarticle} \usepackage[dvips]{graphicx} \begin{document} \includegraphics[width=9cm, clip]{gazou.eps} \end{document} dvioutで表示、setup parameterでgraphicのGIFをbmp full color にしてPrint Qualityを標準印刷(高品質)に設定しました。bmpの時と同じ高品位紙で印刷したのですが、全体に陰影が弱くなり、黄色がかった明るい色調になりました。 原因を考えて見たもののどうしたらよいかわかりません。対策がありましたらお願い致します。 1. epsへの変換工程 2. LaTeXやdvioutの設定 3. プリンタの問題 (家庭用インクジェットではepsにしても意味ない?) -------------- 画像 : 旧macromedia のドロー系ソフトで作ったbmp (300dpi) OS : Windows XP プリンタ: Canon PIXUS4200 (色の管理: 自動)

  • MATLABで画像の表示方法

    a = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\2266057137_611af466d4.jpg'); b = imread('C:\Users\Labmember2011\Desktop\MatlabStuffs\pc.jpg'); cont = 0; %フレームカウンター figure; tic; %ストップウオッチタイマの開始 while(toc<10) %10秒の間アニメーション if toc > cont*0.5 %0.5秒間隔でフレームを更新 if mod(cont, 2) %カウンターが偶数の時はaの画像を表示 image(a); else %奇数の場合はbの画像を表示 image(b); end drawnow() %確実に描画させる cont = cont+1; end pause(0.05); %CPU使用率が上がるのが嫌な場合はpauseを入れる。(フレーム更新の精度はその分落ちる) end で実行したら2枚の画像が切り替わるプログラムが実行されました。 複数枚画像の表示方法はどのように書いたら実行できますか? 教えてください。

  • YUVからRGBへの色空間

    QuickTimeベースのシステムで、ソースは問いませんが(例えばデジベから)取り込んでできたQuickTimeのファイルにはIREの-10~110%の信号が生きているとします。これをRGBベースのコンポジットソフトに渡すさいにRGBの連番に変換が必要となっています。 普通にAfterEffectsなどで、連番書き出しした時に-10~110%の信号は連番になっても生きているのでしょうか? 変換時に丸め込まれて0~16/235~255の省略されて 16~235の情報が0~255に引き延ばされてしまうのでしょうか? またそうなってしまはないようにキッチリと YUV→RGB→YUVの受け渡しをしたい場合どういったワークフローを組めば可能となるのでしょうか? 教えていただければ、非常に助かります。

  • WinAPIでの画像高速切り替え表示プログラム1

    WinAPIを使用して、ビットマップ画像を8枚読み込み、それを連続高速表示するプログラムを作成しています。 今はSetTimerを使ってWM_TIMERを受け取ったときに画像をInvalidateRect(再描画)しています。 以下のソースで動作はするのですが、WM_TIMERは整数ミリ秒でしか設定できず、精度も悪く優先順位も遅いようなので他の方法を考えています。 画像8枚を6.25msecで切り替えて表示するというのをESCAPEするまで繰り返したいのですが...。 リフレッシュレートは160Hzにあげています。 QueryPerformanceFrequencyというものを使えばいいのかなと思っていますが、どこでどう使えばいいのか、それをどう受け取って再描画すればいいのかわかりません。 どなたかご教授お願いします。ソースファイルを書いていただけたら嬉しいです。 #include<windows.h> #define BMP_SUM8//画像の総数 #define TIMER_ID (100) // 作成するタイマの識別ID #define TIMER_ELAPSE (6) // WM_TIMERの発生間隔 LRESULT CALLBACK WindowProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){ HDC hdc; PAINTSTRUCT ps; HBITMAP hBitmap; int i; const char *filename[BMP_SUM]={"gazou0.bmp", "gazou1.bmp", "gazou2.bmp", "gazou3.bmp", "gazou4.bmp", "gazou5.bmp", "gazou6.bmp", "gazou7.bmp"}; static HDC hMemDC[BMP_SUM]; static BITMAP bmp; static int bmp_index;//現在の画像番号 LONG lResult; switch(uMsg) { case WM_CREATE: hdc=GetDC(hWnd); for(i=0;i<BMP_SUM;i++){ hBitmap=(HBITMAP)LoadImage(0,filename[i],IMAGE_BITMAP,0,0,LR_LOADFROMFILE); hMemDC[i]=CreateCompatibleDC(hdc); SelectObject(hMemDC[i],hBitmap); } GetObject(hBitmap,sizeof(BITMAP),&bmp); DeleteObject(hBitmap); ReleaseDC(hWnd,hdc); return 0; case WM_TIMER: if( wParam != TIMER_ID ) { break; // 識別IDが一致しないタイマメッセージはDefWindowProc()に任せる } if(++bmp_index >= BMP_SUM) bmp_index=0; for(i = 0; i < BMP_SUM; i++){ InvalidateRect( hWnd, NULL, FALSE ); } return 0; case WM_DESTROY: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); return 0; case WM_PAINT: hdc=BeginPaint(hWnd,&ps); BitBlt(hdc,0,0,bmp.bmWidth,bmp.bmHeight,hMemDC[bmp_index],0,0,SRCCOPY); EndPaint(hWnd,&ps); return 0; case WM_KEYDOWN: switch((CHAR)wParam) { case VK_ESCAPE: for(i=0;i<BMP_SUM;i++) DeleteDC(hMemDC[i]); PostQuitMessage(0); //WM_QUITメッセージを出す return 0; } } return DefWindowProc(hWnd,uMsg,wParam,lParam); } 入りきらないので2つに分けます。 続きは「WinAPIでの画像高速切り替え表示プログラム2」を見てください。