在图像处理中,边缘是一幅图像中最基本的特征,每幅图像的边缘包含了用于识别的有用信息,是图像分析和模式识别的主要特征提取手段。
作者:Trustintruth
来源: https://zhuanlan.zhihu.com/p/101227585
在模式识别或进行其他的中,在很多方法来识别,其中一种方法就是识别出来图像边缘。在图像中,一幅图像的“临界”表示为图像上亮度显著变化的地方,边缘指的是一个区域的结束,也是另一个区域的开始。“边缘点”指的是图像中具有坐标[x,y],且处在强度显著变化的位置上的点。常用的边缘检测算法大多是以原始图像灰度值为基础,通过考察图像的每个像素的某个邻域内 灰度的变化,利用边缘一阶或二阶导数的规律来检测边缘。下图左边为原始的黑白灰度的图像,通过边缘检测算法后变成了右边的图像。
sobel 是一个梯度的计算,如下图所示,是 x 和 y 方向的 3x3 窗口的卷积。
使用算式
来计算目标点的卷积值:
这里注意一定是绝对值,要大于0.
计算完成以后,要进行简单的二值化处理,将 sobel 值和阈值对比,产生黑白的二值化图像。 将大于阈值设置为与背景色相反的图像。
代码如下:
module sobel (
input rst,
input pclk,
input[7:0] threshold,
input de,
input[7:0] data_in,
output reg[7:0] data_out
);
reg[7:0] p11,p12,p13;
reg[7:0] p21,p22,p23;
reg[7:0] p31,p32,p33;
wire[7:0] p1,p2,p3;
reg[9:0] x1,x3;
reg[9:0] y1,y3;
reg[9:0] abs_x,abs_y;
reg[10:0] abs_g;
linebuffer_Wapper#
(
.no_of_lines(3),
.samples_per_line(1024),
.data_width(8)
)
linebuffer_Wapper_m0(
.ce (1'b1 ),
.wr_clk (pclk ),
.wr_en (de ),
.wr_rst (rst ),
.data_in (data_in),
.rd_en (de ),
.rd_clk (pclk ),
.rd_rst (rst ),
.data_out ({p3,p2,p1} )
);
always@(posedge pclk)
begin
p11 <= p1;
p21 <= p2;
p31 <= p3;
p12 <= p11;
p22 <= p21;
p32 <= p31;
p13 <= p12;
p23 <= p22;
p33 <= p32;
end
always@(posedge pclk)
begin
x1 <= {2'b00,p11} + {2'b00,p31} + {1'b0,p21,1'b0};
x3 <= {2'b00,p13} + {2'b00,p33} + {1'b0,p23,1'b0};
y1 <= {2'b00,p11} + {2'b00,p13} + {1'b0,p12,1'b0};
y3 <= {2'b00,p31} + {2'b00,p33} + {1'b0,p32,1'b0};
end
always@(posedge pclk)
begin
abs_x <= (x1 > x3) ? x1 - x3 : x3 - x1;
abs_y <= (y1 > y3) ? y1 - y3 : y3 - y1;
abs_g <= abs_x + abs_y;
end
always@(posedge pclk)
begin
data_out <= (abs_g > threshold) ? 8'h00 : 8'hff;
end
endmodule
代码已上传至公共号,获取更多代码与资料,欢迎关注我啊!
推荐阅读
关注此系列,请关注专栏FPGA的逻辑