为了解决后续对于固定颜色的识别,需要对OV5640摄像头采集的图像进行预处理。预处理的思路为rgb2YCbCr
corrode
expand
之后对预处理的图片进行边界提取。
图像预处理
下面给出了常见的图像预处理的手段(灰度处理,中值滤波,高斯滤波,RGB2YCbCr,腐蚀,膨胀,边界提取等),部分给出了相应的代码。
灰度处理
常见24位的 RGB888一个像素点包含1600多万种颜色,而灰度图像则为8位的深度图像。rgb2gray主要有以下几种办法:分量法,平均值法,公式法,和查找表法。
module rgb2gray
#(parameter PROC_METHOD = "FORMULA"
//"AVERAGE" "FORMULA" "LUT"
)
(input clk,
input rerset_p,
input rgb_valid,
input rgb_hs,
input rgb_vs,
input [7:0]red_8b_i,
input [7:0]green_8b_i,
input [7:0]blue_8b_i,
output reg gray_8b_o,
output reg gray_valid,
output reg gray_hs,
output reg gray_vs,
)
generate
if (PROC_METHOD = "AVERAGE") begin:PROC_AVERAGE
平均值法
wire [9:0]sum;
reg [15:0]gray_r;
assign sum = red_8b_i + green_8b_i + blue_8b_i;
always@(posedge clk or posegde reset_p)begin
if(reset_p) gray_r <= 16'b0;
else if(rgb_valid) gray_r <=(sum<<6) + (sum<<4) + (sum<<2) +sum;
else gray_r <= 16'b0;
end
assign gray_8b_o = gray_r;
always@(posedge clk)begin
gray_valid <= rgb_valid;
gray_hs <= rgb_hs;
gray_vs <= rgb_vs;
end
else if(PROC_METHOD = "FORMULA") begin:PROC_FORMULA
公式法
reg [15:0]sum;
wire[15:0]red_x77;
wire[15:0]green_x150;
wire[15:0]blue_x29;
assign red_x77 = (red_8b_i << 6) + (red_8b_i << 3) + (red_8b_i << 2) + red_8b_i;
assign green_x150 = (green_8b_i<< 7)