FPGA实现RGB与HSV的转换

本文介绍了RGB到HSV及HSV到RGB的颜色空间转换算法,并提供了详细的Verilog实现代码。通过这些算法,可以实现不同颜色空间之间的高效转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RGB到HSV的转换公式为

在这里插入图片描述

由于s的范围是0到1,所以用verilog实现时,将s扩大256倍,容易表示,当然会丢失精度,其次,这里用到许多除法,笔者用的工具可以直接综合除法,所以这里没有例化除法器,当然,例化除法器ip核也是一样的效果。

实现代码如下:

module rgb2hsv(
input clk,
input reset_n,
input [7:0]rgb_r,
input [7:0]rgb_g,
input [7:0]rgb_b,
input vs,
input hs,
input de,
output [8:0]hsv_h,
output [8:0]hsv_s,
output [7:0]hsv_v,
output hsv_vs,
output hsv_hs,
output hsv_de);


reg [7:0]max;
reg	[7:0]min;
reg	[13:0]rgb_r_r;
reg	[13:0]rgb_g_r;
reg	[13:0]rgb_b_r;

reg [13:0]rgb_r_r2;
reg	[13:0]rgb_g_r2;
reg	[13:0]rgb_b_r2;
reg	[7:0]max_r;

wire [7:0]max_min;
assign	max_min=max-min;
reg  [7:0]max_min_r;
wire [13:0]max60;
assign max60=max*60;

wire [13:0] g_b;
wire [13:0] b_r;
wire [13:0] r_g;
assign	g_b=(rgb_g_r>=rgb_b_r)?(rgb_g_r-rgb_b_r):(rgb_b_r-rgb_g_r);
assign  b_r=(rgb_b_r>=rgb_r_r)?(rgb_b_r-rgb_r_r):(rgb_r_r-rgb_b_r);
assign  r_g=(rgb_r_r>=rgb_g_r)?(rgb_r_r-rgb_g_r):(rgb_g_r-rgb_r_r);


reg [13:0]temp;
reg	[13:0]hsv_h_r;
reg	[15:0]hsv_s_r;
reg	[7:0]hsv_v_r;


always@(posedge clk or negedge reset_n)begin
	if(!reset_n)begin
		rgb_r_r<=0;
		rgb_g_r<=0;
		rgb_b_r<=0;
	end
	else begin
		rgb_r_r<=60*rgb_r;
        rgb_g_r<=60*rgb_g;
        rgb_b_r<=60*rgb_b;
	end
end	

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)begin
		rgb_r_r2<=0;
        rgb_g_r2<=0;
	    rgb_b_r2<=0;
	end
	else begin
		rgb_r_r2<=rgb_r_r;
	    rgb_g_r2<=rgb_g_r;
	    rgb_b_r2<=rgb_b_r;
	end
end
	
always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		max<=0;
	else if((rgb_r>=rgb_b)&&(rgb_r>=rgb_g))
		max<=rgb_r;
	else if((rgb_g>=rgb_b)&&(rgb_g>=rgb_r))
		max<=rgb_g;
	else if((rgb_b>=rgb_r)&&(rgb_b>=rgb_g))
		max<=rgb_b;
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		min<=0;
	else if((rgb_r<=rgb_b)&&(rgb_r<=rgb_g))
		min<=rgb_r;
	else if((rgb_g<=rgb_b)&&(rgb_g<=rgb_r))
		min<=rgb_g;
	else if((rgb_b<=rgb_r)&&(rgb_b<=rgb_g))
		min<=rgb_b;
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		max_min_r<=0;
	else
		max_min_r<=max_min;
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		temp<=0;
	else if(max_min!=0)begin
		if(rgb_r_r==max60)
			temp<=g_b/{6'b0,max_min};
		else if(rgb_g_r==max60)
			temp<=b_r/{6'b0,max_min};
		else if(rgb_b_r==max60)
			temp<=r_g/{6'b0,max_min};
	end
	else if(max_min==0)
		temp<=0;
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		max_r<=0;
	else
		max_r<=max;
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		hsv_h_r<=0;
	else if(max_r==0)
		hsv_h_r<=0;
	else if(rgb_r_r2==60*max_r)
		hsv_h_r<=(rgb_g_r2>=rgb_b_r2)?temp:(14'd360-temp);
	else if(rgb_g_r2==60*max_r)
		hsv_h_r<=(rgb_b_r2>=rgb_r_r2)?(temp+120):(14'd120-temp);
	else if(rgb_b_r2==60*max_r)
		hsv_h_r<=(rgb_r_r2>=rgb_g_r2)?(temp+240):(14'd240-temp);
end

always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		hsv_s_r<=0;
	else if(max_r==0)
		hsv_s_r<=0;
	else
		hsv_s_r<={max_min_r,8'b0}/{8'b0,max_r};
end


always@(posedge clk or negedge reset_n)begin
	if(!reset_n)
		hsv_v_r<=0;
	else
		hsv_v_r<=max_r;
end
	
reg [2:0]vs_delay;
reg	[2:0]hs_delay;
reg	[2:0]de_delay;

	
always@(posedge clk or negedge reset_n)begin
	if(!reset_n)begin
		vs_delay<=0;
        hs_delay<=0;
        de_delay<=0;
	end
	else begin
		vs_delay <= { vs_delay[1:0],vs};
        hs_delay <= { hs_delay[1:0],hs};
        de_delay <= { de_delay[1:0],de};
	end
end

assign hsv_vs=vs_delay[2];
assign hsv_hs=hs_delay[2];
assign hsv_de=de_delay[2];

assign hsv_h=hsv_h_r[8:0];
assign hsv_s=hsv_s_r[8:0];
assign hsv_v=hsv_v_r;

endmodule

HSV到RGB的转换公式:
在这里插入图片描述

实现代码:

module hsv2rgb(
input clk,
input reset_n,
input [8:0]i_hsv_h,
input [8:0]i_hsv_s,
input [7:0]i_hsv_v,
input vs,
input hs,
input de,
output [7:0]rgb_r,
output [7:0]rgb_g,
output [7:0]rgb_b,
output rgb_vs,
output rgb_hs,
output rgb_de

);


reg [7:0]i_hsv_v_r1;
reg [7:0]i_hsv_v_r2;
reg [7:0]i_hsv_v_r3;
reg [7:0]i_hsv_v_r4;
reg [8:0]i_hsv_h_r;
reg [8:0]i_hsv_s_r1;
reg [8:0]i_hsv_s_r2;
reg [8:0]i_hsv_s_r3;
reg [8:0]i_hsv_s_r4;

wire [8:0]temp;
assign temp=9'd256-i_hsv_s;

reg [16:0] p;//p=V-V*S,,扩大256
reg [7:0] p2;
reg [7:0]p3;
reg [2:0]I;//H/60的商
reg [2:0]I2;
reg [2:0]I3;
wire [5:0]f;//H/60的余数
assign f=i_hsv_h_r-I*60;
reg [15:0]f_60;

reg [15:0]adjust;



always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
i_hsv_v_r1 <= 0;
i_hsv_v_r2 <= 0;
i_hsv_v_r3<=0;
i_hsv_v_r4<=0;
end
else begin
i_hsv_v_r1<=i_hsv_v;
i_hsv_v_r2<=i_hsv_v_r1;
i_hsv_v_r3<=i_hsv_v_r2;
i_hsv_v_r4<=i_hsv_v_r3;
end
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)
i_hsv_h_r<=0;
else
i_hsv_h_r<=i_hsv_h;
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
i_hsv_s_r1<=0;
i_hsv_s_r2<=0;
i_hsv_s_r3<=0;
i_hsv_s_r4<=0;
end
else begin
i_hsv_s_r1<=i_hsv_s;
i_hsv_s_r2<=i_hsv_s_r1;
i_hsv_s_r3<=i_hsv_s_r2;
i_hsv_s_r4<=i_hsv_s_r3;
end
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
p<=0;
p2<=0;
p3<=0;
end
else begin
p<=temp*i_hsv_v;
p2<=p[15:8];
p3<=p2;
end
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)
I<=0;
else if(i_hsv_h<60)
I<=0;
else if((i_hsv_h<120)&&(i_hsv_h>=60))
I<=1;
else if((i_hsv_h<180)&&(i_hsv_h>=120))
I<=2;
else if((i_hsv_h<240)&&(i_hsv_h>=180))
I<=3;
else if((i_hsv_h<300)&&(i_hsv_h>=240))
I<=4;
else
I<=5;
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
I2<=0;
I3<=0;
end
else begin
I2<=I;
I3<=I2;
end
end


always@(posedge clk or negedge reset_n)begin
if(!reset_n)
f_60<=0;
else
f_60<={f,8'b0}/60;
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)
adjust<=0;
else
adjust<=(i_hsv_v_r2-p2)*f_60[7:0];
end


/**************************************/
reg [7:0]rgb_r_r;
reg [7:0]rgb_g_r;
reg [7:0]rgb_b_r;

reg [3:0]vs_delay;
reg [3:0]hs_delay;
reg [3:0]de_delay;

always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
rgb_r_r<=0;
rgb_g_r<=0;
rgb_b_r<=0;
end
else case(I3)
0: begin
rgb_r_r<=i_hsv_v_r3;
rgb_g_r<=p3+adjust[15:8];
rgb_b_r<=p3;
end

1: begin
rgb_r_r<=i_hsv_v_r3-adjust[15:8];
rgb_g_r<=i_hsv_v_r3;
rgb_b_r<=p3;
end

2: begin
rgb_r_r<=p3;
rgb_g_r<=i_hsv_v_r3;
rgb_b_r<=p3+adjust[15:8];
end

3: begin
rgb_r_r<=p3;
rgb_g_r<=i_hsv_v_r3-adjust[15:8];
rgb_b_r<=i_hsv_v_r3;
end

4: begin
rgb_r_r<=p3+adjust[15:8];
rgb_g_r<=p3;
rgb_b_r<=i_hsv_v_r3;
end

5: begin
rgb_r_r<=i_hsv_v_r3;
rgb_g_r<=p3;
rgb_b_r<=i_hsv_v_r3-adjust[15:8];
end

default: begin
rgb_r_r<=0;
rgb_g_r<=0;
rgb_b_r<=0;
end
endcase
end

always@(posedge clk or negedge reset_n)begin
if(!reset_n)begin
vs_delay<=0;
hs_delay<=0;
de_delay<=0;
end
else begin
vs_delay<={vs_delay[2:0],vs};
hs_delay<={hs_delay[2:0],hs};
de_delay<={de_delay[2:0],de};
end
end

assign rgb_r = (i_hsv_s_r4==0)?i_hsv_v_r4:rgb_r_r;
assign rgb_g = (i_hsv_s_r4==0)?i_hsv_v_r4:rgb_g_r;
assign rgb_b = (i_hsv_s_r4==0)?i_hsv_v_r4:rgb_b_r;

assign rgb_vs = vs_delay[3];
assign rgb_hs = hs_delay[3];
assign rgb_de = de_delay[3];

endmodule

参考文献:

[1]袁奋杰, 周晓, 丁军,等. 基于FPGA的RGB和HSV色空间转换算法实现[J]. 电子器件, 2010, 33(4):5.

爬虫Python学习是指学习如何使用Python编程语言来进行网络爬取和数据提取的过程。Python是一种简单易学且功能强大的编程语言,因此被广泛用于爬虫开发。爬虫是指通过编写程序自动抓取网页上的信息,可以用于数据采集、数据分析、网站监测等多个领域。 对于想要学习爬虫的新手来说,Python是一个很好的入门语言。Python的语法简洁易懂,而且有丰富的第三方库和工具,如BeautifulSoup、Scrapy等,可以帮助开发者更轻松地进行网页解析和数据提取。此外,Python还有很多优秀的教程和学习资源可供选择,可以帮助新手快速入门并掌握爬虫技能。 如果你对Python编程有一定的基础,那么学习爬虫并不难。你可以通过观看教学视频、阅读教程、参在线课程等方式来学习。网络上有很多免费和付费的学习资源可供选择,你可以根据自己的需求和学习风格选择适合自己的学习材料。 总之,学习爬虫Python需要一定的编程基础,但并不难。通过选择合适的学习资源和不断实践,你可以逐步掌握爬虫的技能,并在实际项目中应用它们。 #### 引用[.reference_title] - *1* *3* [如何自学Python爬虫? 零基础入门教程](https://blog.csdn.net/zihong523/article/details/122001612)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [新手小白必看 Python爬虫学习路线全面指导](https://blog.csdn.net/weixin_67991858/article/details/128370135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值