形态学滤波(五)

形态学滤波(五)

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

对于图像处理而言,是纵向和横向两个维度的处理。我们知道,对于任何二维的操作,都可以分解为一维方向的操作来简化来设计。在图像处理中,习惯是首先横向处理,然后纵向处理。所谓横向处理就是对每一行进行处理。对于尺寸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

原文发布于微信公众号 - 瓜大三哥(xiguazai_tortoise)

原文发表时间:2017-09-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WOLFRAM

show函数组合多个图形在同一个坐标系下

10920
来自专栏xingoo, 一个梦想做发明家的程序员

利用CSS制作脸书

很多网站都支持图片上的头像框识别,鼠标在头像框处,会提示一些人物信息。 这次就利用CSS实现这样一个功能: div处主要包括两部分,一部分是图片;另一部...

20290
来自专栏本立2道生

Matlab图像处理常用基本函数

之前用Matlab做图像处理工作时,用到什么函数就查什么函数,从没做过系统的总结,再做的时候又要去查,所以总结还是有必要的~

21720
来自专栏数据小魔方

粗边面积图

今天给大家分享的是一种在财经杂志上常见的粗边面积图。 ▽▼▽ 这种图表制作起来步骤并不复杂,主要是排版和图表元素格式化需要一些精加工。 ? ●●●●● 下面是制...

27250
来自专栏编程语言

Python:pygame的初步使用(pygame.draw)(二)

11220
来自专栏中国白客联盟

识别验证码继续爆破后台(三)

有的时候,并不是说所有验证码用api或者tesseract都可以正确识别出来的,还是需要经过相关训练,让tesseract知道你想让它识别出来的验证码。

17640
来自专栏视觉求索无尽也

Markdown:插入数学公式

1.1K20
来自专栏数据小魔方

直方图

今天跟大家分享直方图的制作技巧! ▼ 直方图是统计描述常用的图表工具,虽然跟柱形图外表有点类似,但是制作方法却要比柱形图复杂得多,今天要跟大家分享两种直方图的制...

30560
来自专栏葡萄城控件技术团队

ActiveReports 报表应用教程 (3)---图表报表

葡萄城ActiveReports报表的图表控件支持绝大多数常用的二维和三维图表类型,包括XY图表和财务图表。通过使用图表控件的定制功能,如修改坐标轴、图注、图例...

24970
来自专栏图形学与OpenGL

实验二 直线DDA生成算法的GDI实现

理解基本图形元素光栅化的基本原理,掌握一种基本图形元素光栅化算法,利用GDI实现直线光栅化的DDA算法。

21320

扫码关注云+社区

领取腾讯云代金券