Y=img_ycbcr(:,:,1); Cb=zeros(row_expand/2,col_expand/2); Cr=zeros(row_expand/2,col_expand/2); for i=1:row_expand/2 for j=1:2:col_expand/2-1 Cb(i,j)=double(img_ycbcr(i*2-1,j*2-1,2)); Cr(i,j)=double(img_ycbcr(i*2-1,j*2+1,3)); end end for i=1:row_expand/2 for j=2:2:col_expand/2 Cb(i,j)=double(img_ycbcr(i*2-1,j*2-2,2)); Cr(i,j)=double(img_ycbcr(i*2-1,j*2,3)); end end
时间: 2023-06-13 09:07:50 浏览: 108
这段代码的功能是将 YCbCr 格式的图像数据中的 Cb 和 Cr 分量分别提取出来,并将它们的尺寸缩小一半。具体来说,首先从 YCbCr 图像数据中提取出亮度分量 Y,然后根据 Cb 和 Cr 分量的采样方式(4:2:0),将它们的尺寸缩小一半,即每隔一个像素取一个样本值,最后得到缩小后的 Cb 和 Cr 分量。
代码中使用了两个循环来实现这个功能。第一个循环先遍历行,然后在每行中每隔一个像素取一个 Cb 和 Cr 的样本值,即 j 取奇数值时取样本值。第二个循环同样遍历行,但是在每行中每隔一个像素取另一个 Cb 和 Cr 的样本值,即 j 取偶数值时取样本值。最后得到的 Cb 和 Cr 分量的尺寸都是原来的一半。
相关问题
im_l_cb = imresize(im_l_cb, [row, col], 'bicubic'); im_l_cr = imresize(im_l_cr, [row, col], 'bicubic'); im_l_ycbcr = zeros([row, col, 3]); im_l_ycbcr(:, :, 1) = im_l_y; im_l_ycbcr(:, :, 2) = im_l_cb; im_l_ycbcr(:, :, 3) = im_l_cr; img_Y(frame).data = im_l_y; im_l(frame).data = ycbcr2rgb(uint8(im_l_ycbcr));
这段代码主要是对读取的 YUV 数据进行预处理。首先,使用 imresize 函数将 im_l_cb 和 im_l_cr 调整为与原始图像相同的大小(row, col),使用的插值方法是 'bicubic'。接下来,创建了一个大小为(row, col, 3)的零矩阵 im_l_ycbcr,用于存储转换后的 YCbCr 数据。然后,将 im_l_y、im_l_cb 和 im_l_cr 分别赋值给 im_l_ycbcr 的三个通道,使得 im_l_ycbcr 包含了完整的 YCbCr 数据。
接着,将 im_l_y 存储在结构体数组 img_Y(frame) 的 data 字段中,用于后续处理。最后,使用 ycbcr2rgb 函数将 im_l_ycbcr 转换为 RGB 格式,并将结果存储在结构体数组 im_l(frame) 的 data 字段中。
这样,经过预处理的 YUV 数据已经转换为 RGB 格式,并存储在 im_l(frame) 的 data 字段中,以供后续的视频编码过程使用。
% 打印函数1:RGB输入,YCbCr输出 % RGB2YCbCr_Data_Gen(uinit8 img_RGB, uint8 img_YCbCr) % img_RGB:输入待处理的RGB图像 % img_YCbCr:输入处理后的YCbCr图像 % img_RGB.dat:输出 待处理的RGB图像hex数据(比对源数据) % img_YCbCr.dat:输出处理完的YCbCr图像hex数据(比对结果) function RGB2YCbCr_Data_Gen(img_RGB, img_YCbCr) h1 = size(img_RGB,1); % 读取图像高度 w1 = size(img_RGB,2); % 读取图像宽度 h2 = size(img_YCbCr,1); % 读取图像高度 w2 = size(img_YCbCr,2); % 读取图像宽度 % ------------------------------------------------------------------------- % Simulation Source Data Generate bar = waitbar(0,'Speed of source data generating...'); %Creat process bar fid = fopen('.\img_RGB.dat','wt'); for row = 1 : h1 r = lower(dec2hex(img_RGB(row,:,1),2))'; g = lower(dec2hex(img_RGB(row,:,2),2))'; b = lower(dec2hex(img_RGB(row,:,3),2))'; str_data_tmp = []; for col = 1 : w1 str_data_tmp = [str_data_tmp,r(col*2-1:col*2),' ',g(col*2-1:col*2),' ',b(col*2-1:col*2),' ']; end str_data_tmp = [str_data_tmp,10]; fprintf(fid,'%s',str_data_tmp); waitbar(row/h1); end fclose(fid); close(bar); % Close waitbar % ------------------------------------------------------------------------- % Simulation Target Data Generate bar = waitbar(0,'Speed of target data generating...'); %Creat process bar fid = fopen('.\img_YCbCr.dat','wt'); for row = 1 : h2 Y = lower(dec2hex(img_YCbCr(row,:,1),2))'; Cb = lower(dec2hex(img_YCbCr(row,:,2),2))'; Cr = lower(dec2hex(img_YCbCr(row,:,3),2))'; str_data_tmp = []; for col = 1 : w2 str_data_tmp = [str_data_tmp,Y(col*2-1:col*2),' ',Cb(col*2-1:col*2),' ',Cr(col*2-1:col*2),' ']; end str_data_tmp = [str_data_tmp,10]; fprintf(fid,'%s',str_data_tmp); waitbar(row/h2); end fclose(fid); close(bar); % Close waitbar
这是一个 MATLAB 函数,用于将 RGB 图像转换为 YCbCr 图像,并生成模拟数据用于比对源数据和处理结果。该函数包括以下输入和输出:
输入:
- img_RGB:待处理的 RGB 图像
- img_YCbCr:处理后的 YCbCr 图像
输出:
- img_RGB.dat:待处理的 RGB 图像的十六进制数据(用于比对源数据)
- img_YCbCr.dat:处理后的 YCbCr 图像的十六进制数据(用于比对处理结果)
该函数通过循环遍历图像的每一行和每一列,将 RGB 图像中的每个像素的 R、G、B 值转换为对应的 Y、Cb、Cr 值,并将转换后的结果写入到输出文件中。
该函数还包括进度条显示,用于表示数据生成的进度。
需要注意的是,该函数可能需要根据实际情况进行修改,例如修改输入输出文件的路径和文件名等。
阅读全文