形态学滤波(五)

时间:2022-04-28
本文章向大家介绍形态学滤波(五),主要内容包括形态学滤波(五)、之一维形态学腐蚀/膨胀子模块设计、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

形态学滤波(五)

之一维形态学腐蚀/膨胀子模块设计

对于图像处理而言,是纵向和横向两个维度的处理。我们知道,对于任何二维的操作,都可以分解为一维方向的操作来简化来设计。在图像处理中,习惯是首先横向处理,然后纵向处理。所谓横向处理就是对每一行进行处理。对于尺寸nxn的处理窗口可以采用一个1xn的窗体从图像第一行第一列开始,自左向右滑动,依次取出窗口内的n个限售股灰度值,比较得到灰度最小值或者最大值并按顺序存储。

以处理窗口尺寸为5说明,要完成5个数据的比较,可以在一个时钟完成两对数据的比较,第二个时钟完成上述比较结果的比较,第三个时钟完成与最后一个数据的比较,整个电路的时间开销为比较的次数,即窗口尺寸/2+1,在资源上需要4个比较器来实现5个数据的比较,。如图所示:

将minmax模块输出的较小值接入下一级比较模块输入,得到的就是腐蚀操作,否则,就是膨胀操作。

`timescale 1ns / 1ps
module morph_1D(
rst_n,
clk,
din,
din_valid,
dout_valid,
dout
 );
parameter DW = 14;
parameter KSZ = 3;
parameter ERO_DIL = 1; //0 膨胀操作
 //1 腐蚀操作
input rst_n;
input clk;
input [DW-1:0] din;
input din_valid;
output [DW-1:0] dout;
output dout_valid;
localparam med_idx = (KSZ>>1);//处理半径尺寸
reg [KSZ - 1 : 0] din_valid_r; //输入有效缓存,用于时序对齐
reg [DW - 1 : 0] reg_din;//缓存数据
//中间比较结果寄存器 min max,对于窗口尺寸为5,则有4个中间寄存器
wire [DW - 1 : 0] min [0:KSZ-2];
wire [DW - 1 : 0] max [0:KSZ-2];
//缓存输入有效信号用于时序对齐
//缓存数据
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
din_valid_r <= {KSZ{1'b0}};
reg_din <= {DW{1'b0}};
end
else
begin
din_valid_r <= ({din_valid_r[KSZ - 2:0],din_valid});
reg_din <= din;
end
end
//调用第一个比较模块,比较前两拍数据
minmaxcmp_min_max(
.clk(clk),
.valid(din_valid_r[0]),
.din_a(reg_din),
.din_b(din),
.dout_min(min[0]), //前两拍的较小值
.dout_max(max[0]) //前两拍的较大值
);
//如果是腐蚀操作
generate
if(ERO_DIL)
begin : map2
begin : xdhl0
genvar i;
//例化剩余比较器,共KSZ-2个
for(i = 3; i <= KSZ; i = i + 1)
begin : gen_cmp_min
minmax cmp_min_inst(
.clk(clk),
.valid(din_valid_r[i-2]),
.din_a(min[i-3]),
.din_b(din),
.dout_min(min[i-2]), 
.dout_max(max[i-2]) 
);
end
end
assign dout  = min[KSZ-1]; //输出与最后一个比较器对齐
end
endgenerate
//如果是膨胀操作
generate
if(~ERO_DIL)
begin : map3
begin : xdhl1
genvar i;
//例化剩余比较器,共KSZ-2个
for(i = 3; i <= KSZ; i = i + 1)
begin : gen_cmp_max
minmax cmp_max_inst(
.clk(clk),
.valid(din_valid_r[i-2]),
.din_a(max[i-3]),
.din_b(din),
.dout_min(min[i-2]), 
.dout_max(max[i-2]) 
);
end
end
assign dout  = max[KSZ-1]; //输出与最后一个比较器对齐
end
endgenerate
assign dout_valid = din_valid_r[KSZ-1-med_idx];
endmodule