本文转载自: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)效果图