基于FPGA的图像锐化算法(USM)设计

免费获取源码请关注微信号《FPGA学习笔记册》!

1.图像锐化算法说明

        图像锐化算法在实际的图像处理应用很广泛,例如:医学成像、工业检测和军事领域等;它的作用就是将模糊的图像变的更加清晰。常用的图像锐化算法有拉普拉斯算子、sobel算法,但是它们的效果不是很好,USM反锐化算法可以看做是拉普拉斯算子的加强版,算法具有相当的锐化能力与可控性。

        该算法的设计原理如下所示:

        首先对原图做高斯模糊(半径可调),提取低频成分;然后把原始图像减去低频成分获得高频成分(间接提取高频);再对高频成分与阈值(阈值可调)比较,比阈值大的才进行增强(提高抗噪声性能);最后和原图进行叠加运算。

        通过maltab对图像进行USM算法处理后的图像对比,左边图像为原始图像,右边图像为USM算法处理后的图像;可以发现画红框的地方通过算法处理后图像的边缘变的清晰了,图像轮廓细节更加明显。

2.FPGA系统框架设计

​​​​​​

2.1图像高斯滤波程序设计 

 图像高斯滤波算法主要由三个模块组成:image_chage、image_storage和GS_matrix_mode;Image_chage的作用对输入的图像数据补充虚拟边缘数据;Image_storage的作用实现3*3模板数据缓存;GS_matrix_mode的作用是对输入对3*3模板内的数据进行运算。

2.1 .1image_change模块说明

        根据图像均滤波算法的原理介绍,我们可以发现一个问题就是一张图像的外围周边的像素是无法进行算法处理,通过算法处理后的图像的分辨率降低了。如下图所以,周边为红色的像素都是无法参与算法运算的,当3*3的模板在整幅图像进行算法处理后,获得的图像的大小就变成了绿色像素的范围了。在实际的图像处理中有两种办法可以解决这个问题:

        第一个办法就是根据算法的模板大小,配置相机吧原始图像分辨率变大一些,保证算法处理后的图像分辨率为最终想要的分辨率;

        第二种办法就是对原始图像进行修改,人工将分辨率变大,从而保证获得的分辨率为最终想要的分辨,我们这里主要讲第二种办法。   

 举例:原始图像的分辨率是7*3,也就是每行7个像素,一共三行数据;采用的均值滤波模板是3*3的。为了保证图像的边缘数据能够得到处理,我们需要对每行的左右两边各添加一个虚拟的像素(数值为0),这就能保证每行数据的原始像素都能得到算法运算,同时保证了算法运算后每行的数据的个数不变;同理对行数上我们也要添加两行虚拟行数保证算法运算后的行数不边;image_change模块就是按照这个思路设计的。

 备注:对行数的处理,本模块在原始图像的结尾处添加一行,对于开头的添加的虚拟行通过后面的模块来实现。

 

  • 1. image_change程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

Oimage_VS_in

Input

1

原始图像输入的场信号

Oimage_HS_in

Input

1

原始图像输入的行信号

Oimage_data_in

Input

WIDTH

原始图像数据信号

Cimage_VS_out

Output

1

算法处理后的场信号

Cimage_HS_out

Output

1

算法处理后的行信号

Cimage_data_out

Output

WIDTH

算法处理后的数据

测试用例:

     输入一行数据,该行数据共7个有效数(1~7)运算结果:每行数据的两边各添加一个像素数值为0,一行数据就变成了9个像素,同时行数变成两行,补充的一行填充的数据全部为0。

仿真结果:通过仿真结果证明了我们的程序设计是正确的!

 2.1.2 image_storage模块说明

在真实的视频图像数据中,数据都是一行行的输出,为了能够实现3*3模板的运算,需要对图像数据进行缓存,从而模拟出三行并行数据。

 实现这个缓存常用的方法就是调用FPGA内部的缓存资源来实现,一般大家常用的就是shift_ram、fifo、双端口ram,其中shift_ram是最常用的(因为操作简单);这次设计没有调用上面的资源,我是自己设计了一个shift_ram的IP来实现,一个原因是block_ram缓存资源在FPGA中太宝贵了,一定要省着用;另一个原因是自己设计的IP可以在不同厂家的FPGA芯片中使用,移植起来比较方便(我了解的卖IP核的都是这样搞,大家可以尝试一下)。Shift_ram的IP设计,我采用了Verilog语法中的generate语句实现的,该语句操作简便灵活,我个人认为FPGA工程师必须掌握的,大家可以学习一下。

  • 1. image_storage程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

Simage_VS_in

Input

1

原始图像输入的场信号

Simage_HS_in

Input

1

原始图像输入的行信号

Simage_data_in

Input

WIDTH

原始图像数据信号

Simage_VS_out

Output

1

算法处理后的场信号

Simage_HS_out

Output

1

算法处理后的行信号

Cimage_data_outA

Output

WIDTH

算法处理后的数据

Cimage_data_outB

Output

WIDTH

算法处理后的数据

Cimage_data_outC

Output

WIDTH

算法处理后的数据

仿真结果:

   如下图所示,红圈内的数据是输出的第一组3*3模板数据,Cimage_data_outC输出的数据全部为零,前面说过给原图添加的第一行虚拟数据在本模块实现。通过仿真验证了本模块设计是正确的。

 

 2.1.3 matrix_mode模块说明

 该模块的作用就是设计一个3*3的模板,当iamge_storage模块输出9个数据时,该模块就开始计算出结果。设计思路如下图所示,就是在要设计9个缓存寄存器通过打拍实现计算功能。

  • 1. Matrix_mode程序接口

名称

方向

位宽

说明

piexl_clk

Input

1

工作时钟

reset

Input

1

复位信号(active high)

image_VS_in

Input

1

原始图像输入的场信号

image_HS_in

Input

1

原始图像输入的行信号

image_data_out

Output

WIDTH

原始图像数据信号

image_VS_out

Output

1

算法处理后的场信号

image_HS_out

Output

1

算法处理后的行信号

image_data_A

Input

WIDTH

算法处理后的数据

image_data_B

Input

WIDTH

算法处理后的数据

image_data_C

Input

WIDTH

算法处理后的数据

仿真结果:如下图所示,仿真结果和均值滤波算法原理是一致的,就是把目标周边的8个像素进行加法运算后求其平均值。

 

 FPGA程序处理的数据在maltab中恢复为图像后,效果与maltab处理的结果一样,图像达到了锐化的效果。

                           

 上图右边为锐化算法处理后的结果,月球坑的边界更加清晰。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法--每日一练

1.数字A除本身以外的因数之和为数字B,B除本身之外的因数之和为A,这样的数对称为相亲数,例如:220的真因数之和为1245101120224455110284,284的真因数之和为 12471142220,请找出2到10000之间所有的相亲数。 …

C#面:简单介绍枚举

枚举(Enumeration) 枚举类型 是由基础整型数值类型的一组命名常量定义的值类型。(这个拗口的表述来自官方文档) 翻译成人话: 枚举是值类型。枚举的成员是常量默认情况下,枚举成员的关联常数值为类型 int…

linux上MySQL的安装

(1)解压安装包 tar -xzvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.33-linux-glibc2.12-x86_64 /usr/local/mysql(2)创建数据目录 [roothecs-161929 3306]# mkdir -p /data/mysql/3306/data [roothecs-161929 3306]# mkdir -p /data/mysql/3306/binlog [roo…

react框架中无构建模式直接使用es6组件

react框架,看到的总是使用es5,通过webpack编译构建。react官方,直到现在的v18.1.0版本中,只有cjs和umd版本,都没有esm(es6)版本,看起来是对es6的不认可? 但是&#xff0…

科研学习|论文解读——一种修正评分偏差并精细聚类中心的协同过滤推荐算法

知网链接 一种修正评分偏差并精细聚类中心的协同过滤推荐算法 - 中国知网 (cnki.net) 摘要 协同过滤作为国内外学者普遍关注的推荐算法之一,受评分失真和数据稀疏等问题影响,算法推荐效果不尽如人意。为解决上述问题,本文提出了一种改进的聚类…

centos 7.x 上安装 AI insightface + pytorch + cuda

centos 英伟达检查工具 lsb_release -a nvidia-smi lspci | grep -i nvidia CUDA v11.7 安装 首先在centos机器上必须先安装英伟达驱动,参考下面的文档 https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html# https://developer.nvidia.com/c…

Docker单机下的容器网络管理

Docker容器网络管理 容器网络类型 Docker安装以后,会在我们的主机上创建三个网络 docker network ls可以看到有bridge、host和none三种网络类型 我们先把ubuntu的网络环境配置一下 docker run -it ubuntu apt update apt install net-tools iputils-ping curl这…

HTML静态网页成品作业(HTML+CSS)——家乡广州介绍设计制作(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

Android Bundle putBinder传输超过1MB数据,Kotlin

Android Bundle putBinder传输超过1MB数据,Kotlin 由于Android系统架构的设计,Activity/Fragment之间通过Intent在Bundle塞进数据进行传输时候,如果数据超过1MB,会抛JE: java.lang.RuntimeException: android.os.Tran…

浏览器预览word

浏览器打开word是直接下载,而打开pdf才是预览。所以需要先将word转为pdf,visual basic将word转pdf的代码: Sub word2pdf()ActiveDocument.ExportAsFixedFormat OutputFileName:"C:\Users\zhour\Documents\contact.pdf", ExportFor…

proto的singular解释

在计算机科学和特别是在协议缓冲区(Protocol Buffers,简称Proto)的上下文中,“singular”这个词具有特定的含义。Protocol Buffers是Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法,广泛用于通信协…

大型语言模型RAG(检索增强生成):检索技术的应用与挑战

摘要 检索增强生成(RAG)系统通过结合传统的语言模型生成能力和结构化数据检索,为复杂的问题提供精确的答案。本文深入探讨了RAG系统中检索技术的工作原理、实现方式以及面临的挑战,并对未来的发展方向提出了展望。 随着大型预训…

IDEA中配置完Maven后 重启就恢复默认设置

目录 问题描述解决方案-修改other settingsother settings改完也不奏效参考这里 问题描述 在IDEA的settings里配置完Maven之后 每次重启或新建一个项目/窗口之后 又恢复成之前的默认配置 解决方案-修改other settings 这和IDEA的版本有关 目前我使用的版本(2020.3.4) 配置完重…

自监督学习的新前沿:大型模型在自然语言处理中的应用

摘要: 自监督学习的新前沿,特别是大型模型在自然语言处理中的应用,正在引领自然语言处理领域的发展。本文将概述自监督学习的新前沿,特别是大型模型在自然语言处理中的应用,以及其在自然语言处理领域的重要性和应用前…

计算机网络期末98+冲刺笔记

一、计算机网络基础 1.1计算机网络的概述 计算机网络的定义:利用通信设备和线路,将地理位置不同的具有独立功能的多台计算机机器外部设备连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息…

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…

如何恢复丢失未保存的 Word 文档指南

在广阔的数字领域&#xff0c;对丢失未保存的 Word 文档的恐惧对于用户来说是再熟悉不过的焦虑了。本指南旨在对用户可能发现自己迫切需要恢复未保存文档的各种场景进行详尽的探索。无论是由于保存失败、意外的系统崩溃还是令人心碎的意外删除&#xff0c;请放心&#xff0c;我…

无线业务配置建议

WPA2802.1X的接入方式 对于商用环境应该提供更安全的认证和加密方式&#xff0c; 推荐使用WPA2的AES加密方式&#xff0c;结合安全级别较高的802.1X认证方式&#xff0c;更适合封闭性较高的企业级用户。 # 配置WPA2的AES 802.1X认证方式。 <HUAWEI> system-view [HUAW…

Docker Commit提交

Docker Commit提交 Docker Commit镜像提交 以一个正在运行的tomcat为例因为docker拉取的镜像都是删减版&#xff0c;所以需要将webapp.dist的文件内容复制到webapps中再将自己制作的镜像放在正在运行服务器上&#xff0c;不是云端服务器上 #进入tomcat&#xff0c;这是一个正…

详解MySQL的MVCC(ReadView部分解析C++源码)

文章目录 1. 什么是MVCC2. MVCC核心组成&#xff08;三大件&#xff09;2.1 MVCC为什么需要三大件 3. 隐藏字段4. undo log4.1 模拟版本链数据形成过程 5. Read View5.1 m_ids5.2 m_creator_trx_id5.3 m_low_limit_id5.4 m_up_limit_id5.5 可见性分析算法 6. MVCC流程模拟6.1 R…