日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > > FPGA開源工作室


1.背景知識

在正是入題之前先給大家講解一下gray圖像,YUV圖像以及Ycbcr圖像。

Gray圖像:灰度圖像就是我們常說的黑白圖像,由黑到白為灰階為0-255。

YUV是被歐洲電視系統(tǒng)所采用的一種顏色編碼方法(屬于PAL),是PALSECAM模擬彩色電視制式采用的顏色空間。在現(xiàn)代彩色電視系統(tǒng)中,通常采用三管彩色攝影機或彩色CCD攝影機進行取像,然后把取得的彩色圖像信號經(jīng)分色、分別放大校正后得到RGB,再經(jīng)過矩陣變換電路得到亮度信號Y和兩個色差信號BY(即U)、RY(即V),最后發(fā)送端將亮度和色差三個信號分別進行編碼,用同一信道發(fā)送出去。這種色彩的表示方法就是所謂的YUV色彩空間表示。采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U、V是分離的。YUV主要用于優(yōu)化彩色視頻信號的傳輸,使其向后相容老式黑白電視。與RGB視頻信號傳輸相比,它最大的優(yōu)點在于只需占用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)。其中“Y”表示明亮度(LuminanceLuma),也就是灰階值;而“U”“V” 表示的則是色度ChrominanceChroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。亮度是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起。色度則定義了顏色的兩個方面色調(diào)與飽和度,分別用CrCb來表示。其中,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。而Cb反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異。

YcbcrrY'CbCr有的時候會被寫作:YCBCR或是Y'CBCR,是色彩空間的一種,通常會用于影片中的影像連續(xù)處理,或是數(shù)字攝影系統(tǒng)中。Y'為顏色的亮度(luma)成分、而CBCR則為藍色和紅色的濃度偏移量成份。Y'Y是不同的,而Y就是所謂的流明(luminance),表示光的濃度且為非線性,使用伽馬修正(gamma correction)編碼處理。

2.FPGA 實現(xiàn)RGB圖像轉(zhuǎn)Gray圖像方法

一般RGB像轉(zhuǎn)灰度(gray)圖像有兩種方法,第一種就是使用RGB圖像的單通道去顯示圖像(R,GB)。

其二就是講RGB圖像轉(zhuǎn)換成Ycbcr圖像,使用Y分量去顯示圖像,來實現(xiàn)彩色圖像轉(zhuǎn)灰度圖。

3.RGB單通道實現(xiàn)灰度圖像的轉(zhuǎn)換


上圖為整個圖像顯示的架構(gòu)。我們采用RGB565格式。

RGB單通道實現(xiàn)灰度圖像FPGA源碼:

//----------------------------------------------------------------------

//  R G B to gray

//----------------------------------------------------------------------

wire[15:0] rgb;

assignTFT_rgb = {rgb[15:11],rgb[15:11],1'b0,rgb[15:11]};  //red

//assignTFT_rgb = {rgb[10:6],rgb[10:5],rgb[10:6]};          //green

//assignTFT_rgb = {rgb[4:0],rgb[4:0],1'b1,rgb[4:0]};          //blue

//assignTFT_rgb = {rgb[4:0],rgb[4:0],1'b0,rgb[4:0]};          //blue

實現(xiàn)結(jié)果

原圖


Red分量

Green分量


Blue分量

由上三個分量顯示圖像來看,Green分量顯示效果較好。大家可以多試其他圖像,這種方法比較簡單,容易實現(xiàn)。

4 RGB圖像轉(zhuǎn)Ycbcr圖像實現(xiàn)gray圖像。


RGB轉(zhuǎn)Ycbcr算法:

計算公式: Y  = 0.183R + 0.614G + 0.062B + 16;

CB = -0.101R -0.338G + 0.439B + 128;

CR =  0.439R - 0.399G - 0.040B + 128;

其中,時序在計算過程中完全沒有用到

輸入到輸出有三個clock的時延。

第一級流水線計算所有乘法;

第二級流水線計算所有加法,把正的和負的分開進行加法;

第三級流水線計算最終的和,若為負數(shù)取0;

Modelsim仿真部分希望自己去做。

RGB轉(zhuǎn)Ycbcr FPGA源碼:

/*

RGB轉(zhuǎn)YUV算法

計算公式: Y =  0.183R + 0.614G + 0.062B + 16;

CB= -0.101R - 0.338G + 0.439B + 128;

CR=  0.439R - 0.399G - 0.040B + 128;

其中,時序在計算過程中完全沒有用到

輸入到輸出有三個clock的時延。

第一級流水線計算所有乘法;

第二級流水線計算所有加法,把正的和負的分開進行加法;

第三級流水線計算最終的和,若為負數(shù)取0

仿真通過

*/

`timescale1ns/1ps

module  rgb_to_ycbcr(

input                                                       clk,

input                           [7 : 0]            i_r_8b,

input                           [7 : 0]            i_g_8b,

input                           [7 : 0]            i_b_8b,


input                                               i_h_sync,

input                                                   i_v_sync,

input                                                   i_data_en,


output                  [7 : 0]            o_y_8b,

output                  [7 : 0]            o_cb_8b,

output                  [7 : 0]            o_cr_8b,


output                                              o_h_sync,

output                                    o_v_sync,

output                    o_data_en

);


/***************************************parameters*******************************************/

//multiply256

parameter     para_0183_10b = 10'd47;    //0.183 定點數(shù)

parameter     para_0614_10b = 10'd157;

parameter     para_0062_10b = 10'd16;

parameter     para_0101_10b = 10'd26;

parameter     para_0338_10b = 10'd86;

parameter     para_0439_10b = 10'd112;

parameter     para_0399_10b = 10'd102;

parameter     para_0040_10b = 10'd10;

parameter     para_16_18b = 18'd4096;

parameter     para_128_18b = 18'd32768;

/********************************************************************************************/


/***************************************signals**********************************************/

wire                      sign_cb;

wire                      sign_cr;

reg[17:0]       mult_r_for_y_18b;

reg[17:0]       mult_r_for_cb_18b;

reg[17:0]       mult_r_for_cr_18b;


reg[17:0]       mult_g_for_y_18b;

reg[17:0]       mult_g_for_cb_18b;

reg[17:0]       mult_g_for_cr_18b;


reg[17:0]       mult_b_for_y_18b;

reg[17:0]       mult_b_for_cb_18b;

reg[17:0]       mult_b_for_cr_18b;


reg[17:0]       add_y_0_18b;

reg[17:0]       add_cb_0_18b;

reg[17:0]       add_cr_0_18b;


reg[17:0]       add_y_1_18b;

reg[17:0]       add_cb_1_18b;

reg[17:0]       add_cr_1_18b;


reg[17:0]      result_y_18b;

reg[17:0]       result_cb_18b;

reg[17:0]       result_cr_18b;


reg[9:0]y_tmp;

reg[9:0]cb_tmp;

reg[9:0]cr_tmp;


reg                              i_h_sync_delay_1;

reg                              i_v_sync_delay_1;

reg                              i_data_en_delay_1;


reg                              i_h_sync_delay_2;

reg                              i_v_sync_delay_2;

reg                              i_data_en_delay_2;


reg                              i_h_sync_delay_3;

reg                              i_v_sync_delay_3;

reg                              i_data_en_delay_3;

/********************************************************************************************/


/***************************************initial**********************************************/

initial

begin

mult_r_for_y_18b <= 18'd0;

mult_r_for_cb_18b <= 18'd0;

mult_r_for_cr_18b <= 18'd0;


mult_g_for_y_18b <= 18'd0;

mult_g_for_cb_18b <= 18'd0;

mult_g_for_cr_18b <= 18'd0;


mult_b_for_y_18b <= 18'd0;

mult_g_for_cb_18b <= 18'd0;

mult_b_for_cr_18b <= 18'd0;



add_y_0_18b <= 18'd0;

add_cb_0_18b <= 18'd0;

add_cr_0_18b <= 18'd0;


add_y_1_18b <= 18'd0;

add_cb_1_18b <= 18'd0;

add_cr_1_18b <= 18'd0;


result_y_18b <= 18'd0;

result_cb_18b <= 18'd0;

result_cr_18b <= 18'd0;


i_h_sync_delay_1 <= 1'd0;

i_v_sync_delay_1 <= 1'd0;

i_data_en_delay_1 <= 1'd0;


i_h_sync_delay_2 <= 1'd0;

i_v_sync_delay_2 <= 1'd0;

i_data_en_delay_2 <= 1'd0;


end

/********************************************************************************************/


/***************************************arithmetic*******************************************/

//LV1pipeline : mult

always @(posedge      clk)

begin

mult_r_for_y_18b <= i_r_8b *para_0183_10b;

mult_r_for_cb_18b <= i_r_8b *para_0101_10b;

mult_r_for_cr_18b <= i_r_8b *para_0439_10b;

end


always @(posedge      clk)

begin

mult_g_for_y_18b <= i_g_8b *para_0614_10b;

mult_g_for_cb_18b <= i_g_8b * para_0338_10b;

mult_g_for_cr_18b <= i_g_8b *para_0399_10b;

end


always @(posedge      clk)

begin

mult_b_for_y_18b <= i_b_8b *para_0062_10b;

mult_b_for_cb_18b <= i_b_8b *para_0439_10b;

mult_b_for_cr_18b <= i_b_8b *para_0040_10b;

end

//LV2pipeline : add

always @(posedge      clk)

begin

add_y_0_18b <= mult_r_for_y_18b +mult_g_for_y_18b;

add_y_1_18b <= mult_b_for_y_18b +para_16_18b;


add_cb_0_18b <= mult_b_for_cb_18b +para_128_18b;

add_cb_1_18b <= mult_r_for_cb_18b +mult_g_for_cb_18b;


add_cr_0_18b <= mult_r_for_cr_18b +para_128_18b;

add_cr_1_18b <= mult_g_for_cr_18b +mult_b_for_cr_18b;

end

//LV3pipeline : y + cb + cr


assign     sign_cb = (add_cb_0_18b >=add_cb_1_18b);

assign     sign_cr = (add_cr_0_18b >=add_cr_1_18b);

always @(posedge      clk)

begin

result_y_18b <= add_y_0_18b +add_y_1_18b;

result_cb_18b <= sign_cb ?(add_cb_0_18b - add_cb_1_18b) : 18'd0;

result_cr_18b <= sign_cr ?(add_cr_0_18b - add_cr_1_18b) : 18'd0;

end


always @(posedge      clk)

begin

y_tmp <= result_y_18b[17:8] +{9'd0,result_y_18b[7]};

cb_tmp <= result_cb_18b[17:8] +{9'd0,result_cb_18b[7]};

cr_tmp <= result_cr_18b[17:8] +{9'd0,result_cr_18b[7]};

end


//output

assign     o_y_8b   =(y_tmp[9:8] == 2'b00) ? y_tmp[7 : 0] : 8'hFF;

assign     o_cb_8b        =(cb_tmp[9:8] == 2'b00) ? cb_tmp[7 : 0] : 8'hFF;

assign     o_cr_8b  =(cr_tmp[9:8] == 2'b00) ? cr_tmp[7 : 0] : 8'hFF;

/********************************************************************************************/


/***************************************timing***********************************************/

always @(posedge      clk)

begin

i_h_sync_delay_1 <= i_h_sync;

i_v_sync_delay_1 <= i_v_sync;

i_data_en_delay_1 <= i_data_en;


i_h_sync_delay_2 <= i_h_sync_delay_1;

i_v_sync_delay_2 <= i_v_sync_delay_1;

i_data_en_delay_2 <=i_data_en_delay_1;


i_h_sync_delay_3 <= i_h_sync_delay_2;

i_v_sync_delay_3 <= i_v_sync_delay_2;

i_data_en_delay_3 <=i_data_en_delay_2;

end

//--------------------------------------

//timing

//--------------------------------------

assign     o_h_sync = i_h_sync_delay_3;

assign     o_v_sync = i_v_sync_delay_3;

assign    o_data_en = i_data_en_delay_3;


/********************************************************************************************/

Endmodule


代碼2


////////////////////////////////////////////////////////////////

wire[15:0] rgb;

wire hs;

wire vs;

wire de;


wire[7 :0]             o_y_8b;

wire[7 :0]             o_cb_8b;

wire[7 :0]             o_cr_8b;


assignTFT_rgb = {o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};     //Y

//assignTFT_rgb = {o_cb_8b[7:3],o_cb_8b[7:2],o_cb_8b[7:3]};  //cb

//assignTFT_rgb = {o_cr_8b[7:3],o_cr_8b[7:2],o_cr_8b[7:3]};  //cr


代碼已經(jīng)過驗證,實現(xiàn)效果


原圖


Y分量實現(xiàn)效果

此方法實現(xiàn)RGB轉(zhuǎn)gray圖像效果較好。

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉