从RGB到YUV的转化之MATLAB

在图像处理中,经常会遇到RGB和YUV图像的问题,虽然有一些工具可以直接转化,但是对于数据的处理过程并不太清晰,这里给出MATLAB的实现,直观感受数据转化过程及结果。

1.从RGB转为YUV422

clc;close all;clear 
infilename = '***.bmp';
outfilename = '***.yuv';
RGBimg =imread(infilename);
%figure;imshow(RGBimg);
YUVimg = rgb2ycbcr(RGBimg);     %%% rgb -> yuv
%figure;imshow((YUVimg));
[imgHeight imgWidth imgDim] = size(YUVimg);   %%
len = imgHeight*imgWidth*imgDim;
yuvimout = zeros(1,len);
Y = YUVimg(:,:,1);     % Y 矩阵
U = YUVimg(:,:,2);     % U 矩阵
V = YUVimg(:,:,3);     % V 矩阵

R = RGBimg(:,:,1);     % R 矩阵
G = RGBimg(:,:,2);    % G 矩阵
B = RGBimg(:,:,3);     % B 矩阵

%Y = 0.257*R+0.504*G+0.098*B+16; 
%V = 0.439*R-0.368*G-0.071*B+128;
%U = -0.148*R-0.291*G+0.439*B+128;

len = imgHeight*imgWidth*3/2;
yuv420out = [];
yuv420sampY = Y;
yuv420sampU = U(1:2:size(U,1),1:2:size(U,2));
yuv420sampV = V(2:2:size(V,1),1:2:size(V,2));
[m,n] = size(yuv420sampY);
[m,n] = size(yuv420sampU);
[m,n] = size(yuv420sampV);

yuv420sampY = reshape(yuv420sampY',1,[]);
yuv420sampU = reshape(yuv420sampU',1,[]);
yuv420sampV = reshape(yuv420sampV',1,[]);
[m,n] = size(yuv420sampY);
[m,n] = size(yuv420sampU);
[m,n] = size(yuv420sampV);
yuv420sampUV = zeros(1,m*n*2);
yuv420sampUV(1:2:end) = yuv420sampU;%%uv数据交错排列
yuv420sampUV(2:2:end) = yuv420sampV;
[m,n] = size(yuv420sampUV);
yuv420out = [yuv420out reshape(yuv420sampY',1,[])];    %Y 注意要转置
yuv420out = [yuv420out reshape(yuv420sampUV',1,[])];   %VU
%直接拼成YY
%       YY
%       UV

fid= fopen(outfilename,'wb');
    fwrite(fid,yuv420out,'uint8');
fclose(fid);

1.从RGB转为YUV422SP

clc;close all;clear 
%NV12
infilename = '***.bmp';
outfilename = '***.yuv';
RGBimg =imread(infilename);
%figure;imshow(RGBimg);
YUVimg = rgb2ycbcr(RGBimg);     %%% rgb -> yuv

Y = YUVimg(:,:,1);     % Y 矩阵
U = YUVimg(:,:,2);     % U 矩阵
V = YUVimg(:,:,3);     % V 矩阵
[h w d] = size(YUVimg);  %%获取长宽数据
len = h*w*2
yuv422out = zeros(1,len);
yuv422sampY = Y;
yuv422sampU = U(:,1:2:size(U,2));
yuv422sampV = V(:,2:2:size(V,2));
%组成YUYV数据排列
yuv422out(1:2:len) = reshape(yuv422sampY',1,[]);  %Y数据中加0
yuv422out(2:4:len) = reshape(yuv422sampU',1,[]);  %Y数据中隔第二行放U数据
yuv422out(4:4:len) = reshape(yuv422sampV',1,[]);  %Y数据中隔第四行放V数据
[m n] = size(yuv422out);
sprintf('%d,', yuv422out);
%sprintf('0x%x,', yuv422out)
for i=1:4
    for j=1:len/4
        %fprintf('0x%x,', yuv422out((i-1)*len/4+j));
%        fprintf('%d ', yuv422out((i-1)*len/4+j));
    end
%    fprintf('\n');
end
%yuv422out = dec2hex(yuv422out);
fid= fopen(outfilename,'wb');
    fwrite(fid,yuv422out,'uint8');
fclose(fid);

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值