基于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.mfbz.cn/a/455047.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录一下在Pycharm中虚拟环境的创建

如果在Pycharm中要新建一个虚拟环境,那你可以在Terminal中选择Command Prompt,在这里面执行相关命令 一、安装了Anaconda,创建虚拟环境 当你使用解释器是Anaconda提供的时,你可以使用conda命令执行,见以下操作&#x…

Acwing.4261 孤独的照片(贡献法)

题目 Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。 奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。 然而&…

华为组网:核心交换机旁挂防火墙,基于ACL重定向配置实验

如图所示,由于业务需要,用户有访问Internet的需求。 用户通过接入层交换机SwitchB和核心层交换机SwitchA以及接入网关Router与Internet进行通信。为了保证数据和网络的安全性,用户希望保证Internet到服务器全部流量的安全性,配置重…

Flask开发类似jenkins构建自动化测试任务工具

1、自动化 某一天你入职了一家高大上的科技公司,开心的做着软件测试的工作,每天点点点,下班就走,晚上陪女朋友玩王者,生活很惬意。 但是美好时光一般不长,这种生活很快被女主管打破。为了提升公司测试效率…

如何“使用Docker快速安装Jenkins,在CentOS7”?

1、运行 docker run -d --namejenkins -p 8080:8080 jenkins/jenkins 2、查看日志 ,使用 "docker logs -f jenkins",可以持续刷新日志 docker logs jenkins 3、通过命令查看密码 docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminP…

用云服务器构建gpt和stable-diffusion大模型

用云服务器构建gpt和stable-diffusion大模型 一、前置知识二、用云端属于自己的聊天chatGLM3step1、项目配置step2、环境配置1、前置知识2、环境配置流程 step3、创建镜像1、前置知识2、创建镜像流程 step4、通过 Gradio 创建ChatGLM交互界面1、前置知识2、创建ChatGLM交互界面…

YOLOv8改进 | 图像去雾 | 特征融合注意网络FFA-Net增强YOLOv8对于模糊图片检测能力(北大和北航联合提出)

一、本文介绍 本文给大家带来的改进机制是由北大和北航联合提出的FFA-net: Feature Fusion Attention Network for Single Image Dehazing图像增强去雾网络,该网络的主要思想是利用特征融合注意力网络(Feature Fusion Attention Network)直接…

基于单片机的Buck型变换器控制

摘要:对于电子产品而言,必不可少的供电电源,随着人们对电子产品的安全性能要求越来越高,变相的对供电电源提出了新的机遇和挑战。Buck型变换器控制的研究一直是该领域重要的一方面,对于直流斩波电路而言,研…

C#在未安装Halcon环境中调用Halcon的方法

1.1 找到Halcon的dll 将Halcon安装路径下的所有dll复制进一个文件夹内 1.2 放入程序目录下 1.3 设置程序引用目录文件 在App.config中添加如下代码 <runtime><assemblyBinding xmlns"urn:schemas-microsoft-com:asm.v1"><probing privatePath"H…

前端开发小技巧【Vue篇】 - 样式穿透 + 绑定变量

前言 样式穿透 Vue都是通过深度选择器来样式穿透的。当我们在写项目的时候&#xff0c;经常会导入第三方库&#xff0c;有些特殊的情况&#xff0c;就是在导入第三方库后&#xff0c;呈现的样式并不是我们想要的样式&#xff0c;所以我们需要对第三方的样式进行修改&#xff1…

JVM简单调优

jdk自带了许多对jvm进行监控的程序&#xff0c;例如JVisualVM、jstack等等。 现在进行一些简单的对jvm的监控。 我们可以使用JVisualVM来对堆区进行图形化监控。 我们可以在命令行输入jvisualvm&#xff0c;然后就进入了jvisualvm的图形化界面。 然后我们随便执行一个主方法…

选型|匠芯创工业级显示控制MCU

D13x系列微控制器 匠芯创D13x系列是一款基于RISC-V架构的高性能、国产自主、工业级跨界MCU&#xff0c;配备强大的2D图形加速、PNG解码、JPEG编解码引擎&#xff0c;具有丰富的屏接口&#xff0c;具有工业宽温、高可靠性、高开放性&#xff0c;可广泛应用于工业HMI、网关、串口…

20240313寻找集成联调交付的具体方式

集成联调交付&#xff08;Integrated Joint Debugging and Delivery&#xff09;是软件开发过程中的一个阶段&#xff0c;主要涉及将不同的软件模块或组件整合在一起&#xff0c;并进行联合调试和测试&#xff0c;以确保它们能够作为一个整体正常工作。这个过程通常发生在开发周…

ASFF自适应空间特征融合

paper&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection official implementation&#xff1a;https://github.com/GOATmessi7/ASFF 背景 金字塔特征表示pyramid feature representation是解决目标检测中尺度变化挑战的常用方法。特征金字塔的一个主要…

Spring Cloud项目整合Sentinel及简单使用

说明&#xff1a;Sentinel是阿里巴巴开发的微服务治理中间件&#xff0c;可用于微服之间请求的流量管控、权限控制、熔断降级等场景。本文介绍如何在Spring Cloud项目中整合Sentinel&#xff0c;以及Sentinel的简单使用。 环境 首先搭建一个简单的微服务环境&#xff0c;有以…

Linux下的编辑器——Vim

vi/vim 的区别简单点来说&#xff0c;它们都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;它不仅兼容 vi 的所有指令&#xff0c;而且还有一些新的特性在里面。例如语法加亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以运行于x window…

【数据结构】详解线性表的各个函数接口+OJ习题讲解(画图比写代码更重要!!!)

文章目录 一、线性表二、顺序表1、什么是顺序表2、顺序表的分类 三、动态顺序表的实现1、结构的定义2、顺序表的初始化3、检查容量4、在头部插入数据5、在尾部插入数据6、在指定位置插入数据7、在尾部删除数据8、在头部删除数据9、删除指定位置的数据10、查找数据11、修改指定位…

2024 年 2 月公链行业研报

作者&#xff1a;stellafootprint.network 数据来源&#xff1a;Footprint Analytics 公链研究页面 二月份&#xff0c;加密货币市场展现出强劲的上涨势头&#xff0c;这主要得益于比特币和以太坊的价值大幅上涨超过 45%。这一乐观态势也影响到其他代币&#xff0c;前十大代币…

iOS 判断触摸位置是否在图片的透明区域

装扮功能系列&#xff1a; Swift 使用UIScrollerView 实现装扮功能&#xff08;基础&#xff09;Swift 使用UIScrollerView 实现装扮功能&#xff08;拓展&#xff09;iOS 判断触摸位置是否在图片的透明区域 背景 在装扮功能中&#xff0c;一般都是长按使道具进入编辑状态&…

安装MySQL8.0及以上版本操作步骤

关于mysql安装过程中命令mysqld --initialize --console出错的解答 C:\mysql-8.3.0-winx64\bin>mysqld --initialize --usermysql --console 2024-03-12T11:21:23.201387Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start. 2024-03-12T11:21:23.2068…