FPGA实现图像二值形态学滤波——腐蚀膨胀

2023-10-29

一、二值图像

二值图像(Binary Image)是指图像上的每一个像素只有两种可能的取值或灰度等级状态。简言之,在图像中灰度等级只有两种0或255(黑或白).

二、形态学

形态学,即数学形态学(Mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,如边界和连通区域等,便于后续图像识别等工作。

常用场景:边缘检测,孔洞填充,纹理分析、形态骨架提取、形状识别、图像分割、角点提取,图像恢复与重建、图像压缩等。

基本的算法膨胀腐蚀,开操作,闭操作;

先腐蚀后膨胀的过程称为开运算。它具有消除细小物体,在纤细处分离物体和平滑较大物体边界的作用。
先膨胀后腐蚀的过程称为闭运算。它具有填充物体内细小空洞,连接邻近物体和平滑边界的作用。

实现方式:在图像中移动一个结构元素(滤波窗口),后将结构元素与下面的二值图像进行交并等集合运算。因此这种二值形态算法可转换成集合的逻辑运算,简单且适用于并行处理,本文则采用硬件FPGA实现。

三、腐蚀膨胀

对于腐蚀膨胀,输入图像必须是二值图像,通过腐蚀膨胀运算可实现多种功能,如:
(1)抑制噪声
(2)分割出独立元素
(3)连接相邻的元素
(4)寻找图像中明显的极大值和极小值区域
(5)求图像梯度

腐蚀膨胀的原理

1、腐蚀

腐蚀(Erode)是求局部最小值的操作,可消除边界点,使边界向内部收缩,从而消除小且无意义的物体。
以 3x3 模板为例,1 代表白色,0代表黑色。
腐蚀就是用该3*3窗口遍历二值图像上的每个像素,将窗口内的9个像素进行相与运算,结果为 1 则输出为 1,否则为0。
在这里插入图片描述

2、膨胀

膨胀(Dialate)是求局部最大值的操作,能将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程,从而填补物体中空洞。
膨胀即这 9 个像素相或。
在这里插入图片描述
注意:如果背景与图像的颜色互换(0表示白,1表示黑),那么只需要将图像膨胀与腐蚀的与或运算相互颠倒即可。

四、matlab实现腐蚀膨胀

clc;
clear all;
close all;

RGB = imread('二值化图像.bmp');                %读图
[ROW,COL, DIM] = size(RGB);              %得到图像行列数
%------------------------------< Erode >-----------------------------------
Erode_img = zeros(ROW,COL);
for r = 2:ROW-1
    for c = 2:COL-1
        and1 = bitand(RGB(r-1, c-1), bitand(RGB(r-1, c), RGB(r-1, c+1)));
        and2 = bitand(RGB(  r, c-1), bitand(RGB(  r, c), RGB(  r, c+1)));
        and3 = bitand(RGB(r+1, c-1), bitand(RGB(r+1, c), RGB(r+1, c+1)));
        Erode_img(r, c) = bitand(and1, bitand(and2, and3));
    end
end
%------------------------------< Dilate >----------------------------------
Dilate_img = zeros(ROW,COL);
for r = 2:ROW-1
    for c = 2:COL-1
        or1 = bitor(RGB(r-1, c-1), bitor(RGB(r-1, c), RGB(r-1, c+1)));
        or2 = bitor(RGB(  r, c-1), bitor(RGB(  r, c), RGB(  r, c+1)));
        or3 = bitor(RGB(r+1, c-1), bitor(RGB(r+1, c), RGB(r+1, c+1)));
        Dilate_img(r, c) = bitor(or1, bitor(or2, or3));
    end
end
%------------------------------< show >------------------------------------
figure;         imshow(RGB);       title('原图');
subplot(2,2,1); imshow(Erode_img); title('腐蚀');
imwrite (Erode_img,'Erode_img.bmp');
subplot(2,2,2); imshow(Dilate_img);title('膨胀');
imwrite (Dilate_img,'Dilate_img.bmp');

五、FPGA实现腐蚀

二值化模块、3*3窗口生成模块、腐蚀模块
在这里插入图片描述

verilog实现二值化

module two(
    input            clk,
    input            rst_n,
	 
    input   wire		iValid,

	 input [7:0]  iData,
	 output  reg out_Valid,
    output reg  [7:0]oData_two   
);

 parameter THRESHOLD = 8'd150; //二值化的阈值

always @ (posedge clk or negedge rst_n)
    if(!rst_n)
	     oData_two <= 0;
	 else if (iData > THRESHOLD)
	     oData_two <= 8'd255;
	 else
	     oData_two <= 0;
		  
always @ (posedge clk or negedge rst_n)
    if(!rst_n)
	     out_Valid <= 0;
	 else 
	     out_Valid <= iValid;
endmodule

verlog实现腐蚀

module Erode(
    input            clk,
    input            rst_n,
	 
    input   wire		iValid					,

    input   [7:0]     filter_11,filter_12,filter_13, //生成的3*3窗口数据
    input   [7:0]     filter_21,filter_22,filter_23,
    input   [7:0]     filter_31,filter_32,filter_33,

    output  			 Erode_de    ,//de同步信号
	 
    output  wire  [7:0]    Erode_data  

);

reg [1:0]           de_shift1 ;  


reg  g1,g2,g3,g;


//---------------------------------------------------
//                   腐蚀算法的流水并行运算
//---------------------------------------------------

//clk1,进行所有行的与运算 , &&逻辑与

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	     g1 <= 1'b0;
		  g2 <= 1'b0;
		  g3 <= 1'b0;
		  
	 end
	 else begin
	     g1 <= filter_11 && filter_12 && filter_13;
		  g2 <= filter_21 && filter_22 && filter_23;
		  g3 <= filter_31 && filter_32 && filter_33;
	 end
	 
//clk2,每行与运算的结果再次与运算

always @ (posedge clk or negedge rst_n)
    if(!rst_n) 
	     g <= 1'b0;

	 else 
	     g <= g1 && g2 && g3;
		  	  
assign 	Erode_data =  g ? 8'd255 : 8'd0;

// 打拍做同步

    always @(posedge clk or  negedge rst_n) begin
        if(!rst_n)begin
            de_shift1   <=  2'b0;
				
				end
        else begin
            de_shift1 <= {de_shift1[0], iValid};
				end
    end

    assign Erode_de   = de_shift1[1];


  endmodule

可看到此时窗口中九个像素进行相与操作, 下一个clk计算出g1,g2,g3,均为高电平,下一clk计算出g,为高电平,因此可输出255。同理g为低电平输出0。
在这里插入图片描述

六、FPGA实现膨胀

和腐蚀相同,不同在于是进行或运算,核心代码如下:

//clk1,进行所有行的或

always @ (posedge clk or negedge rst_n)
    if(!rst_n) begin
	      g1 <= 1'b0;
		  g2 <= 1'b0;
		  g3 <= 1'b0;
		  
	 end
	 else begin
	      g1 <= filter_11 || filter_12 || filter_13;
		  g2 <= filter_21 || filter_22 || filter_23;
		  g3 <= filter_31 || filter_32 || filter_33;
	 end
	 
//clk2,每行与运算的结果再次或运算

always @ (posedge clk or negedge rst_n)
    if(!rst_n) 
	     g <= 1'b0;

	 else 
	     g <= g1 || g2 || g3;
		  

	  
assign 	Erode_data =  g ? 8'd255 : 8'd0;

FPGA实现腐蚀膨胀的效果图如下:
左:腐蚀
右:膨胀
在这里插入图片描述

算法简化的技巧:若需要形态学滤波后进行阈值处理,我们即可先阈值处理,后二值化形态学滤波,这样就能减少运算以及硬件资源的消耗,同时缩短延迟。

七、先膨胀后腐蚀的RTL框图:

这里比较简单,就是上述模块之间的互相连接,代码不再赘述。
在这里插入图片描述
同样的,我们也可以先腐蚀后膨胀。
最终,将腐蚀、膨胀,先膨胀后腐蚀的FPGA实现效果进行对比:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA实现图像二值形态学滤波——腐蚀膨胀 的相关文章

  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 使用python实现简单全连接神经网络

    最近在学习神经网络的相关知识 特在此做一个笔记 python语言的功能很强大 可以使用很少的代码实现很多功能 因此大家如果想研究深度学习的话 一定要懂得python语言 这篇笔记记录我的第一次使用python编写神经网络代码的过程 其中代码
  • 保姆级使用PyTorch训练与评估自己的ConvNeXt网络教程

    文章目录 前言 0 环境搭建 快速开始 1 数据集制作 1 1 标签文件制作 1 2 数据集划分 1 3 数据集信息文件制作 2 修改参数文件 3 训练 4 评估 5 其他教程 前言 项目地址 https github com Fafa D
  • 基于Matlab实现图像拼接技术(附上完整源码+图像)

    图像拼接是数字图像处理中一个重要的问题 它的目标是将多张图像拼接成一张更大的图像 图像拼接技术在许多领域中都有广泛的应用 如全景图像拼接 医学图像拼接 遥感图像拼接等 本文将介绍一种基于Matlab实现的图像拼接技术 即基于特征匹配的图像拼
  • 图像二值化

    文章目录 1 图像二值化 2 图像二值化方法及Python实现 2 1 简单二值法 2 2 平均值法 2 3 双峰法 2 4 OTSU法 3 opencv python中二值化方法的应用 3 1 简单阈值分割 Simple Threshol
  • 基于Matlab实现图像融合技术(附上多个仿真源码+数据)

    图像融合技术是一种将多幅图像融合为一幅图像的方法 使得这幅融合图像包含原始图像的所有信息 近年来 图像融合技术已经广泛应用于图像分割 变换和裁剪等领域 本文将介绍如何使用Matlab实现图像融合技术 实现步骤 首先 我们需要了解图像融合的基
  • 【Matlab图片剪裁】

    标题Matlab剪裁图片 提取感兴趣部分 问题描述 当需要从一幅图片中提取一些感兴趣的内容时 比如一些细小的文字 图案等 如果从整个图片中直接提取 必然会大大增加计算量 导致处理时间很长 而且多数计算都是无效计算 进而非常消耗资源 解决办法
  • 【OpenCV】车辆识别 C++ OpenCV 原理介绍 + 案例实现

    目录 前言 一 图像处理 二值化处理 膨胀 腐蚀 开运算 闭运算 二 案例实现 Step1 灰度处理 Step2 对视频进行帧差处理 Step3 二值化处理 Step4 腐蚀处理 Step5 膨胀处理 Step6 标记 框选目标 完整代码
  • 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别 其它版本暂时没试过 欢迎交流 openmv简介 OpenMV是一个开源 低成本 功能强大的机器视觉模块 以STM32F427CPU为核心 集成了OV77
  • FPG—VGA显示器字符显示(附代码)

    目录 1 实操 1 1 字符取模 1 2 顶层模块 1 3 图像数据生成模块 1 3 1 模块框图 1 3 2 波形图绘制 1 3 3 代码编写 1 3 4 仿真验证 2 总结 本例程大部分与VGA显示驱动内容相同 只是显示部分改变了 故此
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 《Pyramid Scene Parsing Network》

    Pytorch代码 1 研究问题 目前基于FCN的语义分割网络缺乏利用不同尺度全局上下文信息的能力 对于复杂图像的语义分割 如ADE20K数据集 存在问题 注 感受野的大小可以粗略表示为使用上下文信息的程度 2 研究方法 提出了金字塔场景理
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • Halcon直线检测

    1 Halcon最常用的直线检测算子 add metrology object line measure 利用Halcon封装好的模型不仅可以检测直线 还可以检测圆 椭圆 矩形等 下面介绍下其余的直线检测的算子 需要配合 skeleton
  • 【图像压缩】QOI图像格式详解

    最近听说一种图像格式比较流行 想起我曾经是做图像压缩的emmmm 就来研究一下 QOI Quite OK Image Format 很好的图像格式 git链接 能快速地无损压缩图像 原理也非常简单 没有各种变换 直接空域处理 而无损压缩 自
  • Python的PIL库

    Python图像库PIL Python Image Library 是python的第三方图像处理库 图像类Image class Image类是PIL中的核心类 比如从文件中加载一张图像 处理其他形式的图像 或者是从头创造一张图像等 Im
  • 图像处理——我理解的傅里叶变换

    1 傅里叶变换的理解 傅里叶变换的相关数学公式目前还没有搞懂 先不整那个东西 我们主要是研究傅里叶变换的一些思想和应用 这个思想起源于牛顿研究那个三棱镜 白光透过棱镜之后会被分解为七种颜色的光 这些光叠加又能形成白光 所以说可以把一种事物分
  • 串口通信知识点总结

    串口是串行接口 serial port 的简称 也称为串行通信接口或COM接口 串口通信是指采用串行通信协议 serial communication 在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式 串口按电气标准及协议来划分
  • Python图像处理:批量添加水印的优雅实现与进阶技巧

    1 简介 在日常图像处理中 为图片添加水印是一项常见任务 有多种方法和工具可供选择 而今天我们将专注于使用Python语言结合PIL库批量添加水印 需要注意的是 所选用的图片格式不应为JPG或JPEG 因为这两种格式的图片不支持透明度设置
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二

随机推荐

  • react-document-title单页应用改变title

    原文地址 在使用react框架开发单页应用时 通常会遇到页面跳转但不知要如何去改变document title页面标题的情况 react document title插件较为完美的帮助我们解决了这一问题 npm文档链接 官方介绍 react
  • OpenCV - 车牌识别新手入门级讲解

    目录 0 引言 1 MFC中的车牌显示 2 车牌定位 3 字符提取 4 文字识别 5 文字预测 0 引言 第一次使用OpenCV完成一个完整的功能 有所收获 特此记录 这篇博客中的车牌识别功能比较简单 只能识别一般的蓝色车牌 只能识别拍摄较
  • Python中数据处理(npz、npy、csv文件;元组、列表、numpy数组的使用)

    目录 1 npz文件 2 npy文件 3 csv文件 4 列表 元组 numpy矩阵 列表 元组 不可变列表 Numpy数组 Numpy矩阵 1 npz文件 npz是python的压缩文件 读取文件 独取文件 读取当前文件夹下的data的m
  • jdk11配置javafx

    下载javafx的jar包 网站 https openjfx io 进去之后直接点下载 下载对应操作系统的版本 这里下载windows系统的 下载完之后是一个压缩包文件 解压 刚开始写好之后是这样的 找不到javafx的类 接下来导入jar
  • [机器学习与scikit-learn-37]:算法-分类-支持向量机-核函数与线性不可分-原理

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 123804551 目录 前言 第1章
  • junit测试案例

    JUnit测试是以Java写成的 使用Java测试Java软件形成一个介于测试及程序代码间的无缝 seamless 边界 在测试的控制下测试变成整个软件的扩充同时程序代码可以被重整 Java编译器的单元测试静态语法检查可已帮助测试程序并且确
  • TCP的三次握手与四次挥手理解及面试题

    序列号seq 占4个字节 用来标记数据段的顺序 TCP把连接中发送的所有数据字节都编上一个序号 第一个字节的编号由本地随机产生 给字节编上序号后 就给每一个报文段指派一个序号 序列号seq就是这个报文段中的第一个字节的数据编号 确认号ack
  • LeetCode: 91 解码方法

    方法一 用递归来做 这道题一开始以为是简单的递归问题 按照从前往后的顺序递归 总是在 10 这个输入上报错 按照从后向前的方法递归 应对短序列没有问题 但是面对长序列 因为存在大量重复计算 所以超时 如果用递归来做 应该用记忆化递归 cla
  • 【linux操作系统】——页表的深入理解

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 在每一个进程中 每个进程都有自己的虚拟内存空间 该内存空
  • 【SpringBoot】yml配置时区的配置项

    时区参数定义yml文件 environment TZ Asia Shanghai services systemManage image ports 8082 8082 environment spring profiles active
  • git回滚reset到指定分支

    在git中我们经常会遇到提交代码之后需要进行回滚的操作 可以通过git reset 命令进行回滚 首先找到需要回滚到的提交的commit id 然后通过 git reset hard 老的commit id 然后更新当前分支到最新提交 gi
  • 16 单台与多台机器配置https证书、全站https(以discuzx为例)

    HTTPS 1 HTTPS基本概述 为什么需要使用HTTPS 因为HTTP不安全 当我们使用http网站时 会遭到劫持和篡改 如果采用https协议 那么数据在传输过程中是加密的 所以黑客无法窃取或者篡改数据报文信息 同时也避免网站传输时信
  • angularJS1笔记-(1)-多控制器

    前端写好 div div div div
  • ubuntu安装lxml

    ubuntu安装lxml 可以参考一下 先执行 sudo apt get install libxml2 dev libxslt dev python dev 然后执行 sudo easy install lxml
  • 用户态、内核态的基本概念及切换方式

    用户态 内核态 一 用户态 内核态的基本概念 二 用户态 内核态的切换方式 一 用户态 内核态的基本概念 用户态 用户态运行的进程可以直接读取用户程序的数据 内核态 内核态运行的进程或程序几乎可以访问计算机的任何资源 不受限制 两者最重要的
  • MySQL8.0.15重置密码 windows10 64位 (忘记密码或者无法登录)

    经过多次试验最终 重置密码的步骤如下 1 以管理员身份 打开命令窗口cmd 输入命令 net stop mysql 停止MySQL服务 2 开启跳过密码验证登录的MySQL服务 输入命令 mysqld console skip grant
  • Linux Ubuntu 设置脚本开机启动

    主要参考下面这个博客 ubuntu18开机启动脚本 但是要注意 有的ubuntu里面并不存在这个目录 在一开始的 vim etc systemd system rc local service 这一步就会失败 比如我的系统 最后我使用fin
  • runtime engine VM的一些随想

    这篇文章还是我在写作的新书 新时期的Node js 入门的一部分 一些比喻 我们可以通过一些现实的比喻来理解接下来要讲述的概念 苏联是社会主义的一种运行时 这大概是我这辈子能想到的最贴切的比喻了 笑 社会主义只是一种思想 可以看做是一门编程
  • 控制流图怎么画

    一 什么是控制流图 控制流图 Control Flow Graph CFG 也叫控制流程图 是一个过程或程序的抽象表现 是用在编译器中的一个抽象数据结构 由编译器在内部维护 代表了一个程序执行过程中会遍历到的所有路径 它用图的形式表示一个过
  • FPGA实现图像二值形态学滤波——腐蚀膨胀

    一 二值图像 二值图像 Binary Image 是指图像上的每一个像素只有两种可能的取值或灰度等级状态 简言之 在图像中灰度等级只有两种0或255 黑或白 二 形态学 形态学 即数学形态学 Mathematical Morphology