www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > > FPGA開源工作室

1 基本概念

顏色空間(color space)是顏色集合的數(shù)學(xué)表示。三個最常用的顏色模型是:RGB(用于計算機(jī)圖像學(xué)中);YIQ、YUV或YCbCr(用于視頻系統(tǒng)中);CMYK(用于彩色打印)。

1.1 YCbCr顏色空間

YCbCr顏色空間是YUV顏色空間的縮放和偏移版本。Y定義為8bit,標(biāo)稱顏色范圍為16-235;Cb和Cr標(biāo)稱顏色表示范圍為16-240。YCbCr的采樣格式一般有4:4:4、4:2:2、4:1:1、和4:2:0。

4:4:4 YCbCr格式:

圖1表示4:4:4格式Y(jié)CbCr采樣點的定位。每個采樣點有Y、Cb和Cr值,每個顏色值的顏色分量為8bit(典型),因此每個采樣點24bit。



圖1 4:4:4采樣

1.2 RGB顏色空間

紅、綠和藍(lán)(RGB)顏色空間廣泛用于計算機(jī)圖像學(xué)和顯示器。紅綠藍(lán)是三種基本的加性顏色,可以用三維的笛卡爾坐標(biāo)系統(tǒng)來表示RGB顏色空間。



1.3 YCbCr到RGB顏色空間的轉(zhuǎn)換:數(shù)學(xué)公式

為了將標(biāo)稱取值范圍為16~235(Studio R’G’B’)的8位YCbCr數(shù)據(jù)轉(zhuǎn)換為R’G’B’顏色公式可以簡化為:

R’=Y+1.371(Cr-128)

G’=Y-0.689(Cr-128)-0.336(Cb-128)

B’=Y+1.732(Cb-128)


2 matlab實現(xiàn)ycbcr444轉(zhuǎn)RGB

close all
clear all
clc
 
I=imread('1.bmp');
 
[H ,W ,D]=size(I);
 
R=double(I(:,:,1));
G=double(I(:,:,2));
B=double(I(:,:,3));
 
 
Y0= double(zeros(H,W));
Cb0 =double(zeros(H,W));
Cr0 = double(zeros(H,W));
 
R0= double(zeros(H,W));
G0 =double(zeros(H,W));
B0 = double(zeros(H,W)); %RGB轉(zhuǎn)YCbCr444 for i = 1:H for j = 1:W
 Y0(i, j) = 0.299*R(i, j) + 0.587*G(i, j) + 0.114*B(i, j);
 Cb0(i, j) = -0.172*R(i, j) - 0.339*G(i, j) + 0.511*B(i, j) + 128;
 Cr0(i, j) = 0.511*R(i, j) - 0.428*G(i, j) - 0.083*B(i, j) + 128; end end for i = 1:H for j = 1:W
 RGB(i, j,1) =Y0(i,j)+1.371*(Cr0(i,j)-128);
 RGB(i, j,2) =Y0(i,j)-0.689*(Cr0(i,j)-128)-0.336*(Cb0(i,j)-128);
 RGB(i, j,3) =Y0(i,j)+1.732*(Cb0(i,j)-128); end end YCbCr(:,:,1)=Y0;
YCbCr(:,:,2)=Cb0;
YCbCr(:,:,3)=Cr0;
 
YCbCr=uint8(YCbCr);
 
RGB=uint8(RGB);
 
figure(1),
imshow(YCbCr),title('YCbCr');
 
figure(2),
imshow(RGB),title('RGB');
轉(zhuǎn)之前(YCbCr444) 轉(zhuǎn)之后(RGB)

3 fpga實現(xiàn)

/*  計算公式:  R = 1.164(Y - 16) + 1.793(CR - 128)                   = 1.164Y           + 1.793CR - 248.128;  G = 1.164(Y - 16) - 0.534(CR - 128) - 0.213(CB - 128) = 1.164Y - 0.213CB - 0.534CR + 76.992;  B = 1.164(Y - 16) 		    + 2.115(CB - 128) = 1.164Y + 2.115CB           - 289.344;  其中,時序在計算過程中完全沒有用到  輸入到輸出有三個clock的時延。  第一級流水線計算所有乘法;  第二級流水線計算所有加法,把正的和負(fù)的分開進(jìn)行加法;  第三級流水線計算最終的和,若為負(fù)數(shù)取0; */ `timescale 1ns/1ps module ycbcr_to_rgb( input clk, input wire[7 : 0]		i_y_8b, input wire[7 : 0]		i_cb_8b, input wire[7 : 0]		i_cr_8b, input i_h_sync, input i_v_sync, input i_data_en, output wire[7 : 0]		o_r_8b, output wire[7 : 0]		o_g_8b, output wire[7 : 0]		o_b_8b, output reg o_h_sync, output reg o_v_sync, output reg o_data_en 
); /***************************************parameters*******************************************/ //multiply 256 parameter para_1164_10b = 10'd297; //1.160 parameter para_1793_10b = 10'd459; //1.793 parameter para_0534_10b = 10'd137; //0.535 parameter para_0213_10b = 10'd54; //0.211 parameter para_2115_10b = 10'd541; //2.113 parameter para_248128_18b = 18'd63521;//248.128 parameter para_76992_18b = 18'd19710; //76.992 parameter para_289344_18b = 18'd74072;//289.344 /********************************************************************************************/ /***************************************signals**********************************************/ wire sign_r; wire sign_g; wire sign_b; reg[17 : 0]	mult_y_for_r_18b; reg[17 : 0]	mult_y_for_g_18b; reg[17 : 0]	mult_y_for_b_18b; reg[17 : 0]	mult_cb_for_g_18b; reg[17 : 0]	mult_cb_for_b_18b; reg[17 : 0]	mult_cr_for_r_18b; reg[17 : 0]	mult_cr_for_g_18b; reg[17 : 0]	add_r_0_18b; reg[17 : 0]	add_g_0_18b; reg[17 : 0]	add_b_0_18b; reg[17 : 0]	add_r_1_18b; reg[17 : 0]	add_g_1_18b; reg[17 : 0]	add_b_1_18b; reg[17 : 0] result_r_18b; reg[17 : 0]	result_g_18b; reg[17 : 0]	result_b_18b; 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; /********************************************************************************************/ /***************************************initial**********************************************/ initial begin mult_y_for_r_18b <= 18'd0;
 mult_y_for_g_18b <= 18'd0;
 mult_y_for_b_18b <= 18'd0;
 
 mult_cb_for_g_18b <= 18'd0;
 mult_cb_for_b_18b <= 18'd0;
 
 mult_cr_for_r_18b <= 18'd0;
 mult_cr_for_g_18b <= 18'd0;

 
 add_r_0_18b <= 18'd0;
 add_g_0_18b <= 18'd0;
 add_b_0_18b <= 18'd0;
 
 add_r_1_18b <= 18'd0;
 add_g_1_18b <= 18'd0;
 add_b_1_18b <= 18'd0;
 
 result_r_18b <= 18'd0;
 result_g_18b <= 18'd0;
 result_b_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;

 
 o_h_sync <= 1'd0;
 o_v_sync <= 1'd0; 
 o_data_en <= 1'd0; end /********************************************************************************************/ /***************************************arithmetic*******************************************/ //LV1 pipeline : mult always @ (posedge clk) begin mult_y_for_r_18b <= i_y_8b * para_1164_10b;
 mult_y_for_g_18b <= i_y_8b * para_1164_10b;
 mult_y_for_b_18b <= i_y_8b * para_1164_10b; end always @ (posedge clk) begin mult_cb_for_g_18b <= i_cb_8b * para_0213_10b;
 mult_cb_for_b_18b <= i_cb_8b * para_2115_10b; end always @ (posedge clk) begin mult_cr_for_r_18b <= i_cr_8b * para_1793_10b;
 mult_cr_for_g_18b <= i_cr_8b * para_0534_10b; end //LV2 pipeline : add always @ (posedge clk) begin add_r_0_18b <= mult_y_for_r_18b + mult_cr_for_r_18b;
 add_r_1_18b <= para_248128_18b;
 add_g_0_18b <= mult_y_for_g_18b + para_76992_18b;
 add_g_1_18b <= mult_cb_for_g_18b + mult_cr_for_g_18b;
 add_b_0_18b <= mult_y_for_b_18b + mult_cb_for_b_18b;
 add_b_1_18b <= para_289344_18b; end //LV3 pipeline : y + cb + cr assign sign_r = (add_r_0_18b >= add_r_1_18b); assign sign_g = (add_g_0_18b >= add_g_1_18b); assign sign_b = (add_b_0_18b >= add_b_1_18b); always @ (posedge clk) begin result_r_18b = sign_r ? (add_r_0_18b - add_r_1_18b) : 18'd0;
 result_g_18b = sign_g ? (add_g_0_18b - add_g_1_18b) : 18'd0;
 result_b_18b = sign_b ? (add_b_0_18b - add_b_1_18b) : 18'd0; end //output 溢出處理 assign o_r_8b = (result_r_18b[17:16] == 2'b00) ? result_r_18b[15 : 8] : 8'hff; assign o_g_8b = (result_g_18b[17:16] == 2'b00) ? result_g_18b[15 : 8] : 8'hff; assign o_b_8b = (result_b_18b[17:16] == 2'b00) ? result_b_18b[15 : 8] : 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;

 
 o_h_sync <= i_h_sync_delay_2;
 o_v_sync <= i_v_sync_delay_2;
 o_data_en <= i_data_en_delay_2; end /********************************************************************************************/ Endmodule


fpga實現(xiàn)YCbCr444轉(zhuǎn)RGB效果和matlab一致。

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