形态学滤波(五)
时间: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
- SVG - 基本的SVG属性
- SVG - 创建SVG图片
- 移动端框架 滚动类 iScroll5
- GoogLeNet的心路历程(二)
- iScroll5 表单元素无法失焦 解决方法
- ResNet原理及其在TF-Slim中的实现
- 了解你服务器的心情——top命令详解
- HTML5视音频代码实例 & WEBM格式转换器
- 解析Tensorflow官方PTB模型的demo
- MyBatis源码解析(一)——MyBatis初始化过程解析
- MyBatis源码解析(二)——动态代理实现函数调用
- Git命令速记
- linux设备驱动第三篇:如何写一个简单的字符设备驱动
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PAT (Basic Level) Practice (中文)1007 素数对猜想
- PAT (Basic Level) Practice (中文)1019 数字黑洞
- PAT (Basic Level) Practice (中文)1022 D进制的A+B
- 记一次线上商城系统高并发的优化
- 15个必须知道的JavaScript数组方法
- RedLock究竟是不是Redis分布式锁分布式环境下的银弹?
- PAT (Basic Level) Practice (中文)1023 组个最小数
- PAT (Basic Level) Practice (中文)1041 考试座位号
- PAT (Basic Level) Practice (中文)1042 字符统计
- 搭建 Apache Jmeter 分布式压测与监控,真那么难搞定?|实战干货
- PAT (Basic Level) Practice (中文)1056 组合数的和
- PAT (Basic Level) Practice (中文)1057 数零壹
- PAT (Basic Level) Practice (中文)1063 计算谱半径
- PAT (Basic Level) Practice (中文)1064 朋友数
- PAT (Basic Level) Practice (中文)1076 Wifi密码