6.RGB转YCbcr

1.方法

RGB转灰度有很多种方式
  1.将RGB中任意分量拿出来当做灰度值。
  2.取RGB三通道的均值来当灰度值。
  3.将RGB转YUV(YCbCr)然后取Y分量作为灰度值。
  其余的几种实现方式较为简单,这里不做介绍。重点实现RGB转YCbCr。

1.1 YUV(YCbCr)格式

  Y表示亮度,U和V表示色度,用于描述影像的饱和度和色调。RGB转YUV的转换一般是色彩空间的转换。YUV主要用在模拟系统中,而YCbCr是通过YUV信号的发展,并通过校正的主要应用在数字视频中的一种编码方法。YUV适用于PAL和SECAM彩色电视制式,而YCrCb适用于计算机用的显示器。 一般意义上 YCbCr 即为 YUV 信号,没有严格的划分。 CbCr 分别为蓝色色度分量、红色色度分量。
RGB注重人色彩的感知,YUV则注重亮度的敏感程度。
使用YUV描述图像的好处在于:
  (1)亮度(Y)与色度(U、V)是独立的;
  (2)人眼能够识别数千种不同的色彩,但只能识别20多种灰阶值,采用YUV标准可以降低数字彩色图像所需的储存容量。

1.1.1 YUV4:4:4

  YUV三个通道采样率相同,因此每个分量相互独立。通常一个分量占8bit,一个像素占3byte。

1.1.2 YUV4:2:2

  YUV三个通道采样率不同,UV分量只有Y的一半,两个UV共占用一个Y。

1.2 RGB转YCbCr公式

在这里插入图片描述
  但是由于Verilog HDL无法进行浮点运算,因此使用扩大256倍,再向右移8Bit的方式来转换公式,(0.083 = 00010101)
在这里插入图片描述

2.算法验证平台搭建

2.1 图片转txt文本

  首先将图片转化为txt文本格式方便其他模块读取。

clear ;
clc ;
close;
RGB = imread('../img/1920x1080.bmp');
imshow(RGB);
[row,col,chn] = size(RGB);
fid = fopen('../data//pre.txt','w+');
for i = 1:row
    for j = 1:col
        for k = 1:chn
            fprintf(fid,'%02x',RGB(i,j,k));
        end
        fprintf(fid,'\n');
    end
end

fclose(fid); 

2.2 txt文本数据仿真回传

2.2.1 文本读取

  这里首先读取MATLAB生成的pre.txt文本,读取txt文本的模块为img_gen3,表示读取的RGB888的数据。

`timescale 1ns / 1ps

module img_gen3
#(
 	parameter 	ACTIVE_IW 	= 	1920 	,
 	parameter 	ACTIVE_IH 	= 	1080 	,
 	parameter 	TOTAL_IW 	= 	2200 	,
 	parameter 	TOTAL_IH 	= 	1100 	,
 	parameter 	H_START 	= 	100 	,
 	parameter 	V_START 	= 	4 		 		
)(
	input 	wire 				clk 	,
	input 	wire 				rst_n 	,
	output 	reg 				vs 		,
	output 	reg  	 	 		de 		,
	output 	reg 	[23:0] 		data 	
);

reg 	[23:0] 	raw_array 	[ACTIVE_IW*ACTIVE_IH-1:0];

integer 	i;

initial 	begin
	for(i=0;i<ACTIVE_IW*ACTIVE_IH;i=i+1)
		raw_array[i] = 0;
end

initial begin
	$readmemh("H:/picture/Z7/lesson6/data/pre.txt",raw_array);
end

reg 	[15:0] 	hcnt 	;
reg 	[15:0] 	vcnt 	;

reg 			h_de 	;
reg 			v_de  	;

reg  			index_de 	;
reg 	[31:0] 	index 	 	;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		hcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		hcnt <= 'd0;
	else 
		hcnt <= hcnt + 1'b1;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1 && vcnt == TOTAL_IH - 1)
		vcnt <= 'd0;
	else if(hcnt == TOTAL_IW - 1)
		vcnt <= vcnt + 1'b1;
	else 
		vcnt <= vcnt;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		vs <= 'd0;
	else if(vcnt>=2)
		vs <= 1'b1;
	else 
		vs <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		h_de <= 'd0;
	else if(hcnt >= H_START && hcnt < H_START + ACTIVE_IW)
		h_de <= 1'b1;
	else 
		h_de <= 1'b0;

always @(posedge clk or negedge rst_n)
	if(!rst_n)
		v_de <= 'd0;
	else if(vcnt >= V_START && vcnt < V_START + ACTIVE_IH)
		v_de <= 1'b1;
	else 
		v_de <=
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值