【FPGA图像处理实战】- 彩色图像灰度化

本文转载自:FPGA入门到精通

今天介绍一下图像处理中的基础算法--彩色图像灰度化。

一、彩色图像处理灰度化

彩色图像灰度化是一种将彩色图像转换为灰度图像的过程。

在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值。

因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。

当灰度为255的时候,表示最亮(纯白);当灰度为0的时候,表示最暗(纯黑)。

灰度化的好处是:相较于彩色图像灰度图像占内存更小,运行速度更快;灰度图像后可以在视觉上增加对比,突出目标区域。

二、图像处理灰度化的方法

1、平均值法

计算图像中每个像素点的RGB值之和,求平均值,作为灰度值。

计算公式:Rn = Gn = Bn = (R + G + B)/3

说明:(Rn,Gn,Bn)表示像素点灰度化后的RGB值,(R,G,B)表示彩色图像的RGB值

2、加权平均值法

将R、G、B三个分量的权重分别设为0.299、0.587、0.114,然后将它们与相应的像素值相乘后相加,得到灰度值。

可以看到这个系数权重实际就是之前RGB转YUV公式中的,亮度Y=0.299*R + 0.587*G + 0.114*B。

也就是说灰度化的图像每个像素点值,Rn = Gn = Bn = Y。

三、FPGA实现

有了上一章RGB转YUV,今天这个算法的实现很简单哦,这里给大家写出模块名和接口,大家可以先实现,再看后面的答案。

1、练习题目

module image_rgb2gray(
input wire clk,
input wire reset,

input wire valid_i,
input wire [23:0] img_data_i,

output wire valid_o,
output wire [23:0] img_data_o
);

endmodule

2、答案

这里给出平均法的verilog实现写法,需要完整的工程,请加入本公众号的知识星球哦,

wire [7:0] R, G, B;

reg valid_d1;
reg [9:0] RGB_avr;

reg valid_d2;
reg [16:0] RGB_avr_m;

reg valid_d3;
reg [7:0] RGB_new;

//平均法
//1/3 * 512 = 171

assign {R, G, B} = img_data_i;
always@(posedge clk or posedge reset) begin
if(reset) begin
valid_d1 <= 'b0;
RGB_avr <= 'b0;
end else begin
valid_d1 <= valid_i;
RGB_avr <= R + G + B;
end
end

//最大值不可能超过255*3*171 = 17'd130815
always@(posedge clk) begin
RGB_avr_m <= RGB_avr * 8'd171;
end
always@(posedge clk or posedge reset) begin
if(reset) begin
valid_d2 <= 'b0;
end else begin
valid_d2 <= valid_d1;
end
end

//最大值不可能超过255
always@(posedge clk or posedge reset) begin
if(reset) begin
valid_d3 <= 'b0;
RGB_new <= 'b0;
end else begin
valid_d3 <= valid_d2;
RGB_new <= RGB_avr_m[16:9];
end
end

assign valid_o = valid_d3;
assign img_data_o = {3{RGB_new}};

3、测试结果

(1)仿真测试时序图

(2)效果图

最新文章

最新文章