PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化

news2024/11/18 17:50:25

为什么要对图像进行拉普拉斯锐化

对图像进行拉普拉斯锐化的目的是增强图像的边缘和细节,使图像看起来更加清晰和锐利。这种技术常用于图像处理中,具体原因如下:

  1. 增强图像的边缘信息:拉普拉斯锐化可以突出图像中的边缘特征,使得边缘更加清晰和突出。它通过对图像进行高通滤波来增强高频信息,从而使得图像中的边缘更加明显。

  2. 提高图像的对比度:拉普拉斯锐化可以增强图像的对比度,使得图像中的灰度变化更加明显。这有助于改善图像的视觉效果,使得图像更加生动和逼真。

  3. 减少图像模糊:拉普拉斯锐化可以减少图像的模糊效果,使得图像看起来更加清晰和细致。它可以去除图像中的低频成分,从而提高图像的清晰度。

  4. 增强图像的细节:拉普拉斯锐化可以增强图像中的细节信息,使得图像中的纹理和细微的特征更加明显。这对于图像分析、目标检测和识别等任务非常有帮助。

  5. 图像预处理:拉普拉斯锐化通常作为图像预处理的一部分,用于改善后续图像处理算法的性能和准确性。例如,在图像识别、目标跟踪和计算机视觉任务中,对图像进行拉普拉斯锐化可以提高算法的鲁棒性和准确率。

总的来说,拉普拉斯锐化是一种常用的图像增强技术,可以提高图像的质量和可用性,使得图像在各种应用领域中都能取得更好的效果。

拉普拉斯锐化算法步骤

图像的拉普拉斯锐化是根据图像每个像素领域内的像素到该像素的突变程度来计算的,计算的是图像像素的变化程度。我们知道,一阶微分函数描述了函数图像是朝哪个方向变化的,或增长或降低。二阶微分函数描述的则是图像变化的速度,是急剧增长(下降)还是平缓的增长(下降)。根据上述的描述,可以知道二阶微分可以得到图像色彩的过渡程度,比如白色与黑色的过渡。

换句话说,当邻域中心像素灰度低于它所在的领域内其它像素的平均灰度时,此中心像素的灰度应被进一步降低;当邻域中心像素灰度高于它所在的邻域内其它像素的平均灰度时,此中心像素的灰度应被进一步提高,以此实现图像的锐化处理

对于3×3的拉普拉斯锐化算子,一个常见的模板如下:

0 -1 0
-1 4 -1
0 -1 0

这个3×3的模板是最常用的拉普拉斯锐化算子之一,中心像素的权重是4,周围的4个像素的权重是-1。这个模板可以突出图像中的边缘和细节,增强图像的锐度。这个卷积核涵盖了图像周围的8个像素,包括水平、垂直和对角方向。通过应用这个卷积核,可以突出图像中的边缘和纹理特征,实现图像的增强和锐化处理。

该卷积核对图像进行二阶微分运算,突出了图像中灰度的快速变化,从而增强了图像的边缘和细节。在卷积之后,可以将得到的图像与原始图像相加,或者将得到的图像与原始图像进行混合,以实现拉普拉斯锐化效果。拉普拉斯锐化可以使图像的边缘更加清晰,细节更加突出,但如果处理不当,可能会导致图像中出现噪点或者增强图像中的噪点。因此,在应用拉普拉斯锐化技术时,需要谨慎调整参数,以获得最佳的图像增强效果。

我们FPGA工程中使用的算子是

0 -1 0
-1 5 -1
0 -1 0

为了使边缘更加锐利,我们将拉普拉斯滤波器的中心值从4更改为5时。这会导致输出图像边缘的增强效果更明显,因为增加中心像素的权重,使其对输出像素的贡献更大,但也可能导致图像中的噪声被放大。

当应用拉普拉斯锐化算法时,通常需要以下步骤:

  1. 图像平滑化:首先,应用高斯滤波器或其他平滑滤波器对原始图像进行平滑化处理。平滑化可以减少图像中的噪声,并有助于提取图像的细节。

  2. 计算拉普拉斯算子:接下来,通过应用预定义的拉普拉斯算子(也称为拉普拉斯核)来计算图像的拉普拉斯变换。这个算子可以突出图像中的边缘和细节,通过检测像素值的变化来增强图像的锐度。

  3. 图像叠加:将原始图像与拉普拉斯变换的结果进行叠加,以增强图像的边缘和细节。这通常是通过将原始图像的像素值与拉普拉斯变换的像素值相加来实现的。这个过程可以突出图像中的边缘和细节,使图像看起来更加清晰和锐利。

  4. 调整亮度:由于拉普拉斯变换可能导致图像的像素值超出了合适的范围,因此在叠加后的图像中可能会出现亮度失真。为了解决这个问题,通常需要对图像的亮度进行调整,以确保像素值在合适的范围内。这可以通过灰度拉伸或直方图均衡等技术来实现。

  5. 结果输出:最后,处理后的图像可以保存为图像文件或直接显示在屏幕上,以供后续分析或应用。这样处理后的图像通常具有更好的边缘和细节,看起来更加清晰和锐利,适用于各种计算机视觉应用。​​​​​​​

pyton代码实现上述过程

python代码如下:

PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化-Anlogic-安路论坛-FPGA CPLD-ChipDebug

在这个示例中,首先读取彩色图像,然后将其转换为灰度图像。然后,对灰度图像应用拉普拉斯算子得到锐化后的灰度图像。对于彩色图像,分别对其三个通道应用拉普拉斯算子,然后将结果合并成彩色图像。最后,显示原始图像、灰度图像、锐化后的灰度图像和锐化后的彩色图像。

matlab实现图像拉普拉斯锐化

PotatoPie 4.0 实验教程(26) —— FPGA实现摄像头图像拉普拉斯锐化-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段 MATLAB 代码实现了图像的锐化功能,具体功能说明如下:

  1. img_sharpen 函数定义了整个处理过程,包括读取彩色图像、转换为灰度图像、应用拉普拉斯算子进行图像锐化,并显示原始图像、灰度图像和锐化后的图像。

  2. 获取当前脚本所在目录,以便读取图像文件。

  3. 读取彩色图像 Lena.jpg

  4. 使用 rgb2gray 函数将彩色图像转换为灰度图像。

  5. 定义拉普拉斯锐化算子 laplacian_kernel,用于图像锐化。

  6. 对灰度图像应用拉普拉斯算子,使用 imfilter 函数进行卷积运算,得到锐化后的灰度图像 sharpened_gray_image

  7. 对彩色图像的每个通道分别应用拉普拉斯算子,同样使用 imfilter 函数,得到锐化后的彩色图像 sharpened_color_image

  8. 分别显示原始图像、灰度图像和锐化后的图像,使用 imshow 函数,并设置标题。

通过这段代码,可以清晰地展示图像的锐化效果,有助于突出图像中的细节和边缘特征。

FPGA工程分析

工程层次图

demo18相比,只是多了一个img_laplacian_fltr的模块,也就是下面这一段代码,在从SDRAM读出来之后,经它处理后再输出hdmi_tx模块。

img_laplacian_fltr
(
  .i_clk(clk_pixel),
  .i_rst_n(sys_rst_n),
  .i_hs(VGA_HS),
  .i_vs(VGA_VS),
  .i_en(VGA_DE),
  .i_r(VGA_RGB[23:16]),
  .i_g(VGA_RGB[15:8] ),
  .i_b(VGA_RGB[7:0]  ),            
  .o_hs(laplacian_hs),
  .o_vs(laplacian_vs),
  .o_en(laplacian_de),   
  .o_r(laplacian_data[23:16]),
  .o_g(laplacian_data[15:8] ),
  .o_b(laplacian_data[7:0]  )
);

img_laplacian_fltr模块代码分析

考虑到FPGA示例的简洁性,我们的FPGA示例工程仅进行第二步计算拉普拉斯算子处理后便显示,不做与彩色原图的合并处理。

img_laplacian_fltr  img_buf fifo_3line这三个代码模块相互关联,构成了一个图像 Laplacian 滤波器。这里的三个模块的作用分别是:

  1. fifo_3line模块:FIFO 内存队列生成器,用于数据的存储和读取。
  2. img_buf 模块:用上面的FIFO模块构成行缓存,让图像的像素按3*3进输。
  1. img_laplacian_fltr 模块:图像 Laplacian 滤波器模块,对输入图像进行 Laplacian 滤波处理。

img_laplacian_fltr模块里面分别对RGB三个通道进行了拉普拉斯算子的模版运算,并处理了对行场信号进行延时以实现与数据同步。模块主以下几步:

  1. 首先用 img_buf实现图像的行缓存,R、G、B的每个通道经过缓存之后由原来的每个时钟一个像素变成了每个时钟9个像素,也就是每个时钟输出一个3*3的像素。
  2. 对每个通首3*3的像素值先进行加法运算然后再进行减法运算(上面的拉普拉斯算子只有这两种运算),最后求和(verilog代码的注释对计算过程以及计算优化作了详细说明,请参见代码)。
  3. 对求出来的和进行输出范围限定,避免计算出来的值下溢超过0或上溢超过255。
  4. 同前面的例程一样,需要将行场信号和数据同步,因此将行场信号打一拍。

算法的核心:

0 -1 0
-1 5 -1
0 -1 0

展开就是:

0*pixel11      -1*pixel12       0*piexe13

-1*pixel21      5*pixel22       -1*piexl23

0*pixel31      -1*pixel32       0*pixel33

前面讲过img_buf 会把图像进行缓存,然后每次输出这三行的三列,也就是3*3个像素。上式中pixel11表示第一行一列的像素,同理pixe32表示第三行的第二个像素。

算法的实现及优化详见verilog代码及其注释。

管脚约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

时序约束

与PotatoPie 4.0 实验教程(18) —— FPGA实现OV5640摄像头采集以SDRAM作为显存进行HDMI输出显示相同,不作赘述。

实验结果图

原图

锐化处理后边界是增强了,但噪点也增加了

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

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

相关文章

【go零基础】go-zero从零基础学习到实战教程 - 0环境配置

是个前端,最近开始学习go,后端除node外基本0基础,所以学习曲线有点绕,目标是个基础的服务端demo,搞个api服务后台,包含基础的用户登录、文章发布和写文章、权限控制,差不多就是个完整博客系统。…

2024年更新迭代最快的宿主软件FL Studio 24.0.99.4094中文激活版

FL Studio 24.0.99.4094中文激活版是我见过更新迭代最快的宿主软件,没有之一。FL Studio12、FL Studio20、FL Studio21、FL Studio24等等。 编辑有时甚至我刚刚下载好了最新版本,熟悉了新版本一些好用的操作,Fl Studio就又推出了更新的版本&a…

视频通话实时换脸:支持训练面部模型 | 开源日报 No.235

iperov/DeepFaceLive Stars: 19.7k License: GPL-3.0 DeepFaceLive 是一个用于 PC 实时流媒体或视频通话的人脸换装工具。 可以使用训练好的人脸模型从网络摄像头或视频中交换面部。提供多个公共面部模型,包括 Keanu Reeves、Mr. Bean 等。支持自己训练面部模型以…

Linux--进程控制(2)--进程的程序替换(夺舍)

目录 进程的程序替换 0.相关函数 1.先看现象 2.解释原理 3.将代码改成多进程版 4.使用其它的替换函数,并且认识函数参数的含义 5.其它 进程的程序替换 0.相关函数 关于进程替换我们需要了解的6个函数: 函数解释: 这些函数如果调用成功则…

Datart 扩装下载功能之PDF和图片下载

Datart 扩装下载功能之PDF和图片下载 首先下载依赖 yum install mesa-libOSMesa-devel gnu-free-sans-fonts wqy-zenhei-fonts -y 然后下载安装chrome yum install https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm 查看chrome版本号 google…

CSS之显示覆盖内容(z-index)

前言&#xff1a; 我们有的时候&#xff0c;希望下方的内容能够显示到上方&#xff0c;达到类似于多个图层的效果&#xff0c;此时我们可以利用z-index这个属性。 介绍&#xff1b; z-index属性值是用来设置元素的堆叠顺序(元素层级)。 覆盖原则&#xff1a; <1>特殊…

Java反序列化-CC3链

前言 前面的CC1与CC6链都是通过 Runtime.exec() 进行命令执行的。当服务器的代码将 Runtime放入黑名单的时候就不能使用了。 CC3链的好处是通过动态加载类的机制实现恶意类代码执行。 版本限制 jdk8u65Commons-Collections 3.2.1 动态类加载 loadClass -> 负责加载load…

船舶空调的特殊性和标准

船用空调的特殊性 船用空调和陆用空调的区别有&#xff1a; ①海洋环境具有高盐度、高湿度的特性&#xff0c;船用空调系统应特别注意防腐和防霉&#xff1b; ②船用空调需要适应船舶在海面航行时的倾斜或摇摆&#xff1b; ③船用空调需要长期在海上运行&#xff0c;维修不易&…

unity 录制360全景渲染图

1.打开pakcageManager &#xff0c;选择packages为 unityRegisty&#xff0c;找到unityRecorder插件下载&#xff0c;点击右下角instant安装&#xff0c;如果插件列表为空&#xff0c;检查是否连接网络&#xff0c;重启Unity 2.打开录制面板 3.add recorder 选择ImageSequence …

基于canal监听MySQL binlog实现数据增量同步

一、背景 业务反馈客服消息列表查询速度慢&#xff0c;有时候甚至要差不多20秒&#xff0c;急需优化提升速度。 二、方案 引入 首先&#xff0c;体验系统&#xff0c;发现查询慢的正是消息列表查询接口。 接着去看代码的设计&#xff0c;流程比较长&#xff0c;但从代码逻…

动手学深度学习——线性回归从零实现

1. 数据集 1.1 生成数据集 要训练模型首先要准备训练数据集&#xff0c;对于线性模型 yXwb&#xff0c;定义生成数据集的函数如下&#xff1a; def synthetic_data(w, b, num_examples): #save"""生成yXwb噪声"""# 从均值为0&#xff0c;标准…

Git重修系列 ------ Git的使用和常用命令总结

一、Git的安装和配置 git安装&#xff1a; Git - Downloads git首次配置用户信息&#xff1a; $ git config --global user.name "kequan" $ git config --global user.email kequanchanqq.com $ git config --global credential store 配置 Git 以使用本地存储机…

基于自注意力机制的长短期记忆神经网络(LSTM-SelfAttention)的回归预测

提示&#xff1a;MATLAB版本需要R2023a以上 基于自注意力机制的长短期记忆神经网络&#xff08;LSTM-SelfAttention&#xff09;是一种用于时序数据预测的模型。这个模型结合了两个不同的结构&#xff0c;即长短期记忆网络&#xff08;LSTM&#xff09;和自注意力机制&#xff…

解决HttpServletRequest中的InputStream/getReader只能被读取一次的问题

一、事由 由于我们业务接口需要做签名校验&#xff0c;但因为是老系统了签名规则被放在了Body里而不是Header里面&#xff0c;但是我们不能在每个Controller层都手动去做签名校验&#xff0c;这样不是优雅的做法&#xff0c;然后我就写了一个AOP&#xff0c;在AOP中实现签名校…

Cesium.js(1):Cesium.js简介

1 前言 现有的gis开发方向较流行的是webgis开发&#xff0c;其中Cesium是一款开源的WebGIS库&#xff0c;主要用于实时地球和空间数据的可视化和分析。它提供了丰富的地图显示和数据可视化功能&#xff0c;并能实现三维可视化开发。Cesium适用于地球科学研究、军事情报分析、航…

Java编程练习之final关键字

1.final类&#xff1a;不允许任何类继承&#xff0c;并且不允许其他人对这个类进行任何改动&#xff1b; 当被某个类设置为final类时&#xff0c;类中的所有方法都被隐式的设置为final形式&#xff0c;但是final类中的成员变量既可以被定义为final形式&#xff0c;又可以被定义…

【区块链】椭圆曲线数字签名算法(ECDSA)

本文主要参考&#xff1a; 一文读懂ECDSA算法如何保护数据 椭圆曲线数字签名算法 1. ECDSA算法简介 ECDSA 是 Elliptic Curve Digital Signature Algorithm 的简称&#xff0c;主要用于对数据&#xff08;比如一个文件&#xff09;创建数字签名&#xff0c;以便于你在不破坏它…

Maven的仓库、周期和插件

优质博文&#xff1a;IT-BLOG-CN 一、简介 随着各公司的Java项目入库方式由老的Ant改为Maven后&#xff0c;相信大家对Maven已经有了个基本的熟悉。但是在实际的使用、入库过程中&#xff0c;笔者发现挺多人对Maven的一些基本知识还缺乏了解&#xff0c;因此在此处跟大家简单地…

SpringCloud系列(19)--将服务消费者Consumer注册进Consul

前言&#xff1a;在上一章节中我们把服务提供者Provider注册进了Consul&#xff0c;而本章节则是关于如何将服务消费者Consumer注册进Consul 1、再次创建一个服务提供者模块&#xff0c;命名为consumerconsul-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并选…

使用CubeMx配置GD32F303系列单片机进行DMA ADC

原理图查看 查原理图可以看到GD32F103C8T6的官方开发板GD32303C-START-V1.0的PA1没有接任何东西 使用PA1作为ADC端口 CubeMX配置ADC和时钟 配置ADC通道 启用循环模式 配置此通道ADC分频 配置ADC DMA为循环模式 配置时钟 生成项目 Keil里面的配置 选择对应的GD32型号 编译…