m基于FPGA的RGB轉(zhuǎn)ycrcb顏色空間轉(zhuǎn)換算法實(shí)現(xiàn),包含testbench,對(duì)比三種轉(zhuǎn)換方法

1.算法仿真效果

vivado2019.2仿真結(jié)果如下:


其中1為直接乘法公式計(jì)算;


2為移位法計(jì)算;


3為分布式計(jì)算;


2.算法涉及理論知識(shí)概要

人類獲得信息的主要方式是視覺,通常情況下顏色有2種描述方式,一種是RGB色度空間表示,一種是 YCbCr色度空間表示。然而,普通的R GB顏色空間對(duì)視頻的顯示存在很多問題,將其轉(zhuǎn)換為YCbCr顏色空間能夠很 好地適應(yīng)現(xiàn)代社會(huì)的要求,本文正是采用一種新的方法,通過FPGA成功地將其轉(zhuǎn)化,并得到正確的結(jié)果,此方法內(nèi) 部變量少、算法優(yōu)點(diǎn)突出、實(shí)時(shí)性好,十分易于在實(shí)際工程中實(shí)現(xiàn)。


 RGB顏色空間

在RGB顏色空間中,1個(gè)帶顏色的圖像采樣是用3個(gè) 值來(lái)表示一個(gè)像素點(diǎn)的相對(duì)的紅、綠和藍(lán)色比(3種光線的 主樣構(gòu)成顏色)。任何顏色都可以通過把紅、綠和藍(lán)通過 不同的比例相混得到。CRT和LCD通過分別對(duì)每個(gè)像素 點(diǎn)的紅綠藍(lán)值進(jìn)行顯示來(lái)得到各種顏色。從一個(gè)通常的觀

察距離來(lái)看,不同的構(gòu)成部分可以達(dá)到顏色上的真實(shí)感。


YCbCr顏色空間

人類視覺系統(tǒng)(HVS)相比亮度來(lái)說對(duì)于顏色不是那 么敏感。在RGB顏色空間中,3種顏色被平等地看待,并 用相同的分辨率存放起來(lái)。但是通過把亮度與顏色信息 分離,并對(duì)亮度值取更高的分辨率可以更有效地表示1個(gè) 顏色圖像。


顏色空間轉(zhuǎn)換

YCbCr顏色空間和它的變換(通常寫為YUV)是1種 流行而高效的表示一個(gè)顏色圖像的方法。YCrCb是國(guó)際 通用的B T.601數(shù)字電視信號(hào)中使用的彩色空間,它由 YU V彩色空間經(jīng)過縮放和平移得到。YCrCb色度空間與 R GB色度空間的轉(zhuǎn)換公式如下:



直接乘法公式計(jì)算


直接相乘,我們直接調(diào)用系統(tǒng)的IP核,如果版本不同,需要重新生成。如代碼段中:



移位法計(jì)算


位移法就是用位移的方法來(lái)替換乘法器。


根據(jù)二進(jìn)制乘法過程。二進(jìn)制的乘法可以理解為,移位相加。



具體代碼如上所示:


例如R*0010001100,那么其第三,四,八為1,所以結(jié)果為R移位7,R移位3,R移位2,最后三個(gè)相加得到。



分布式計(jì)算


分布式算法是一種快速的流水線結(jié)構(gòu)的算法,根據(jù)你提供的論文的要求,這個(gè)分布式算法的具體物理結(jié)構(gòu)如下所示:



將輸入信號(hào)的每一位和另一個(gè)數(shù)相乘,通過10級(jí)流水線操作后,我們可以得到10個(gè)部分積,然后將10個(gè)部分積累加,得到最后的結(jié)果。



3.Verilog核心程序

`timescale 1ns / 1ps

//

// Company:

// Engineer:

//

// Create Date: 2023/03/26 18:01:20

// Design Name:

// Module Name: tops

// Project Name:

// Target Devices:

// Tool Versions:

// Description:

//

// Dependencies:

//

// Revision:

// Revision 0.01 - File Created

// Additional Comments:

//

//



module tops(

clk,

ena,

r,

g,

b,

y,

cr,

cb

);


input ????clk;//輸入時(shí)鐘

input ????ena;//輸入使能信號(hào)

input[7:0]r; ?//輸入R,G,B信號(hào)

input[7:0]g;

input[7:0]b;


output[7:0]y;//輸出Y,CR,CB信號(hào)

output[7:0]cr;

output[7:0]cb;


//mult your_instance_name (

// ?.CLK(CLK), ???// input wire CLK

// ?.A(A), ???????// input wire [9 : 0] A

// ?.B(B), ???????// input wire [9 : 0] B

// ?.SCLR(SCLR), ?// input wire SCLR

// ?.P(P) ???????// output wire [19 : 0] P

//);

//================================================

wire[21:0]y1;

wire[21:0]cr1;

wire[21:0]cb1;

//================================================

wire[19:0]yr;

wire[19:0]yg;

wire[19:0]yb;


mult mult_yr(

.CLK ?(clk),

.A ???(10'd306),

.B ???({r,2'b00}),

.SCLR (ena),

.P ???(yr)

);



mult mult_yg(

.CLK ?(clk),

.A ???(10'd601),

.B ???({g,2'b00}),

.SCLR (ena),

.P ???(yg)

);

mult mult_yb(

.CLK ?(clk),

.A ???(10'd116),

.B ???({b,2'b00}),

.SCLR (ena),

.P ???(yb)

);

assign y1 ?= yr + yg + yb;

assign y ??= y1[21:14];//y計(jì)算公式




wire[19:0]crr;

wire[19:0]crg;

wire[19:0]crb;


mult mult_crr(

.CLK ?(clk),

.A ???(10'd512),

.B ???({r,2'b00}),

.SCLR (ena),

.P ???(crr)

);


mult mult_crg(

.CLK ?(clk),

.A ???(10'd429),

.B ???({g,2'b00}),

.SCLR (ena),

.P ???(crg)

);

mult mult_crb(

.CLK ?(clk),

.A ???(10'd83),

.B ???({b,2'b00}),

.SCLR (ena),

.P ???(crb)

);


assign cr1 = crr - crg - crb;

assign cr ?= cr1[21:14]+128;//cr計(jì)算公式



wire[19:0]cbr;

wire[19:0]cbg;

wire[19:0]cbb;


mult mult_cbr(

.CLK ?(clk),

.A ???(10'd173),

.B ???({r,2'b00}),

.SCLR (ena),

.P ???(cbr)

);


mult mult_cbg(

.CLK ?(clk),

.A ???(10'd339),

.B ???({g,2'b00}),

.SCLR (ena),

.P ???(cbg)

);

mult mult_cbb(

.CLK ?(clk),

.A ???(10'd512),

.B ???({b,2'b00}),

.SCLR (ena),

.P ???(cbb)

);


assign cb1 = cbb - cbr - cbg;

assign cb ?= cb1[21:14]+128;//cb計(jì)算公式

endmodule

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容