RGB转YCbCr算法MATLAB与FPGA实现(Quartus)

您所在的位置:网站首页 rgb2ycbcr函数MATLAB RGB转YCbCr算法MATLAB与FPGA实现(Quartus)

RGB转YCbCr算法MATLAB与FPGA实现(Quartus)

2024-05-27 20:04| 来源: 网络整理| 查看: 265

一、说明

实现平台:Quartus17.1、MATLAB2022b和Modelsim SE-64 10.4

二、内容

本文内容主要实现图片进行RGB模式转化为YCbCr模式的算法实现,首先用MATLAB进行算法的验证,最后再通过FPGA实现具体算法。

三、原理

        YCbCr是一种数字信号,其在数字视频领域应用广泛,是计算机中应用最多的格式,JPEG,MPEG等都采用YCbCr格式。

        YCbCr格式具体可以分为两种格式:tv range格式和full range模式,主要区别如下:

        1)  tv range格式

        Y∈[16,235],Cb∈[16,240],Cr∈[16,240],主要是广播电视采用的数字标准。

        2)full range格式

        Y,Cb,Cr∈[0,255],主要是PC端采用的标准。

        图像传感器可以配置输出RGB/YCbCr格式图像,根据对应手册的转换公式即可。本文根据OV7725图像传感器手册的对应关系:

         使用硬件实现算法,首先要考虑去掉浮点,再不考虑精度的前提下,将数值扩大256倍,为防止溢出,舍去小数点而不进行四舍五入,公式如下:

Y1=R*76.544+G*150.272+B*29.184 \approx R*76+G*150+B*29

        由于数值扩大了256倍,即2的8次方,因此对上述结果再右移8bit,得到结果如下:

Y2=(R*76+G*150+B*29)8

        同上,Cb/Cr的计算公式如下:

Cb=(-R*43-G*84+B*128+32768)8

Cr=(R*128-G*107+B*20+32768)8

四、MATLAB实现

1)RGB转YCbCr

clear all;close all;clc; %read pc image to matlab IMG1 = imread('...\素材\0_images\Scart.jpg');%读取jpg图像 h = size(IMG1,1); %读取图像高度 w = size(IMG1,2); %读取图像宽度 subplot(221); imshow(IMG1); title('RGB Image'); % RGB转YCbCr %Y = (R*76 + G*150 + B*29) >>8 %Cb = (-R*43 - G*84 + B*128 + 32768) >>8 %Cr = (R*128 - G*107 - B*20 + 32768) >>8 IMG1 = double(IMG1); IMG_YCbCr = zeros(h,w,3); for i = 1:h for j = 1:w IMG_YCbCr(i,j,1) = bitshift((IMG1(i,j,1)*76 + IMG1(i,j,2)*150 + IMG1(i,j,3)*29),-8); IMG_YCbCr(i,j,2) = bitshift((-IMG1(i,j,1)*43 - IMG1(i,j,2)*84 + IMG1(i,j,3)*128 + 32768),-8); IMG_YCbCr(i,j,3) = bitshift((IMG1(i,j,1)*128 - IMG1(i,j,2)*107 - IMG1(i,j,3)*20 + 32768),-8); end end %display Y Cb Cr channel IMG_YCbCr = uint8(IMG_YCbCr); subplot(222);imshow(IMG_YCbCr(:,:,1));title('Y Channel'); subplot(223);imshow(IMG_YCbCr(:,:,2));title('Cb Channel'); subplot(224);imshow(IMG_YCbCr(:,:,3));title('Cr Channel');

        MATLAB执行显示图结果(RGB图,Y通道图,Cb通道图和Cr通道图)

 2)仿真数据准备

        为了后续FPGA设计中,配合ModelSim进行RTL仿真,实现仿真模型与Verilog代码的对比分析,需要提前生成Y、Cb、Cr通道的数据。

        首先生成测试图像的数据,用MATLAB转化为img_RGB.dat,保存于当前目录下。将MATLAB转换好的Y、Cb、Cr通道的数据写入到img_YCbCr.dat文件中,用于后续与RTL仿真生成的结果进行对比,具体实现代码封装成函数,如下:

function RGB2YCbCr_Data_Gen(img_RGB, img_YCbCr); % 打印函数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数据(比对结果) 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 source 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

        执行该函数:

% ------------------------------------------------------------------------- % Generate image Source Data and Target Data RGB2YCbCr_Data_Gen(IMG1, IMG_YCbCr);

         生成文件过程:

         最后分别产生了img_RGB.dat和img_YCbCr.dat文件:

         文件具体内容如下:

 五、FPGA实现

 1)FPGA实现代码:

`timescale 1ns/1ns module RGB888_YCbCr444 ( //global clock input clk, input rst_n, //Image data prepared to be processed input per_img_vsync, //prepared Image data vsync valid signal input per_img_href, //prepared Image data href valid signal input [7:0] per_img_red, //prepared Image red data to be processed input [7:0] per_img_green, //prepared Image green data to be processed input [7:0] per_img_blue, //prepared Image blue data to be processed //processed image data output post_img_vsync, //processed Image data vsync valid signal output post_img_href, //processed Image data href valid signal output [7:0] post_img_Y, //processed Image brightness output output [7:0] post_img_Cb, //processed Image blue shading output output [7:0] post_img_Cr //processed Image red shading output ); //step 1 9 parallel multiplication using 1 clocks reg [15:0] img_red_r0,img_red_r1,img_red_r2; reg [15:0] img_green_r0,img_green_r1,img_green_r2; reg [15:0] img_blue_r0,img_blue_r1,img_blue_r2; always @(posedge clk)begin img_red_r0


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3