基于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,一经查实,立即删除!

相关文章

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…

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

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

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…

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;我…

详解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…

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊&#xff0c;不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…

低代码开发平台,快速搭建开源MES系统

MS低代码云MES作为一家专注于提供生产制造数字化方案的服务商&#xff0c;“以客户为中心”、以“数据驱动、智能化、互联化”为企业的核心标签&#xff0c;以低代码平台为切入点&#xff0c;帮助企业构建以人为本的未来供应链生态系统&#xff0c;实现制造企业的智能化转型。 …

Vulnhub - Toppo

希望和各位大佬一起学习&#xff0c;如果文章内容有错请多多指正&#xff0c;谢谢&#xff01; 个人博客链接&#xff1a;CH4SER的个人BLOG – Welcome To Ch4sers Blog Toppo 靶机下载地址&#xff1a;Toppo: 1 ~ VulnHub 0x01 信息收集 Nmap扫描目标主机&#xff0c;发…

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)

文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目&#xff0c;进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持&#xff0c;取巧实现无加密配置&#xff0c;联调环境问题加密数据源配置原理探究自定义加密解…

[LeetCode][110]平衡二叉树

题目 110.平衡二叉树 给定一个二叉树&#xff0c;判断它是否是平衡二叉树。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,3,3,null,null,4,4] 输出&#xff1a;false 示例 3&…

Linux:1_常见指令以及权限理解(上)

常见指令以及权限理解 一.补充知识 为方便初学者更好的理解Linux系统,这部分将对比windows系统补充一部分必要知识1 2 3 4 5 6 二.补充指令 1. 重新认识指令: 指令本质都是程序 —指令、程序、可执行程序都是一回事(都是文件内容属性)指令就是程序 … 安装和卸载是在把可…

分布式搜索引擎elasticsearch(2)

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;[Domain Specific Language](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html)&#xff09;来定义查…

(一)RabbitMQ实战——rabbitmq的核心组件及其工作原理介绍

前言 RabbitMQ是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准&#xff0c;提供可靠的消息传递机制。RabbitMQ可以用于在应用程序之间传递消息&#xff0c;实现不同应用系统之间的解耦和通信。它支持多种编程语言&#xff0c;…

什么是Ribbon,怎么实现负载均衡?

一. Ribbon 是 Netflix 公司开发的一个负载均衡器&#xff08;Load Balancer&#xff09;工具&#xff0c;主要用于在分布式系统中进行客户端侧的负载均衡。它可以集成到微服务架构中的客户端&#xff0c;通过在客户端实现负载均衡算法&#xff0c;来分发请求到多个服务提供者…

彩虹知识付费模板MangoA全开源包含秒杀/抽奖/社群/推送等功能

二次开发增加以下功能每日秒杀每日签到官方社群多级分销在线抽奖项目投稿 每日秒杀 每日签到 官方社群 多级分销 在线抽奖 项目投稿 下载地址&#xff1a;https://pan.xunlei.com/s/VNstMfOecGliiqew7UIorsOnA1?pwdhywi#