之前的单通道灰度转换作为一个图像处理FPGA框架搭建完成后的一个简单效果的测试,其图像的层次感有待提高,图像处理灰度转换用的更多的还是YCbCr。
一、YCbCr
YCbCr或Y’CbCr有的时候会被写作:YCBCR或是Y’CBCR,Y’为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y就是所谓的亮度(luminance),表示光的浓度且为非线性,使用伽马修正(gamma correction)编码处理。人的肉眼对视频的Y分量更敏感,因此在通过对色度分量进行子采样来减少色度分量后,肉眼将察觉不到的图像质量的变化,因此后面的图像处理使用灰度图像都是基于Y分量图像。以后这个YCbCr工程将被作为图像处理的模板。
RGB转YCbCr:
二、MATLAB图像处理
代码:
效果图:
这张图目测Y分量和G分量差别不大,理论上Y分量图像的层次感是最好的,在其他更加精致的图像上能比较明显的观察到,但由于我比较喜欢这张图,就放这张图的效果图好了。
三、FPGA实现
工程设计图和上一个单通道是一致的,都是简单的图像变换,时序上只要求信号同步。将上个单通道输出部分重新编写即可。
1.由于FPGA无法进行浮点数运算,需要将浮点数进行转换。
将浮点数乘以256后,向右移位8位(相当于除以256),再把123写进括号即为YCbCr最终的Verilog表达式。
2.RGB转YCbCr
(1)接收数据,有tft传过来的数据为RGB565,通过低位补零转为RGB888
assign R0 = {TFT_rgb[15:11],3'd0};
assign G0 = {TFT_rgb[10:5],2'd0};
assign B0 = {TFT_rgb[4:0],3'd0};
(2)首先进行上述运算的第一步,乘法运算 _256_对应系数
always@(posedge clk or negedge rst_n)
begin
if(!rst_n) begin
{R1,G1,B1} {16'd0, 16'd0, 16'd0};
{R2,G2,B2} {16'd0, 16'd0, 16'd0};
{R3,G3,B3} {16'd0, 16'd0, 16'd0};
end
else begin
{R1,G1,B1} {{R0 * 16'd77}, {G0 * 16'd150}, {B0 * 16'd29 }};
{R2,G2,B2} {{R0 * 16'd43}, {G0 * 16'd85}, {B0 * 16'd128}};
{R3,G3,B3} {{R0 * 16'd128}, {G0 * 16'd107}, {B0 * 16'd21 }};
end
end
(3)把YCbCr常数项128加入
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)begin
Y1 16'd0;
Cb1 16'd0;
Cr1 16'd0;
end
else begin
Y1 R1 + G1 + B1;
Cb1 B2 - R2 - G2 + 16'd32768;
Cr1 R3 - G3 - B3 + 16'd32768;
end
end
(4)除以256即右移8位,即用一个8位数取16位数据的高8位
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)begin
Y_out 8'd0;
Cb_out 8'd0;
Cr_out 8'd0;
end
else begin
Y_out Y1[15:8];
Cb_out Cb1[15:8];
Cr_out Cr1[15:8];
end
end
(5)到此处,YCbCr格式数据得到了,只用Y分量,取Y分量的高位565值,最终输出ycbcr_rgb
assign ycbcr_rgb = {Y_out[7:3],Y_out[7:2],Y_out[7:3]};
到这里,到这里对于信号ycbcr已经得到,中间三个时序变化,延时3个clk,控制信号也要同步
(6)把控制信号进行同步(手法!!!!!)
always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
TFT_de_r 3'b0;
TFT_hs_r 3'b0;
TFT_vs_r 3'b0;
TFT_pwm_r 3'b0;
TFT_begin_r 3'b0;
TFT_clk_r 3'b0;
end
else begin
TFT_de_r {TFT_de_r[1:0], TFT_de};
TFT_hs_r {TFT_hs_r[1:0], TFT_hs};
TFT_vs_r {TFT_vs_r[1:0], TFT_vs};
TFT_pwm_r {TFT_pwm_r[1:0], TFT_pwm};
TFT_begin_r {TFT_begin_r[1:0], TFT_begin};
TFT_clk_r {TFT_clk_r[1:0], TFT_clk};
end
end
assign ycbcr_de = TFT_de_r[2];
assign ycbcr_hs = TFT_hs_r[2];
assign ycbcr_vs = TFT_vs_r[2];
assign ycbcr_pwm = TFT_pwm_r[2];
assign ycbcr_begin = TFT_begin_r[2];
assign ycbcr_clk = TFT_clk_r[2];
3.rtl视图
4.开发板验证图
Original: https://blog.csdn.net/bingbudingxz/article/details/123631250
Author: bingbudingxz
Title: FPGA图像处理——YCbCr灰度转换
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/640624/
转载文章受原作者版权保护。转载请注明原作者出处!