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

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

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

  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.mzph.cn/web/4512.shtml

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

相关文章

程序不包含适用于入口点的静态Main方法

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

西湖大学赵世钰老师【强化学习的数学原理】学习笔记1节

强化学习的数学原理是由西湖大学赵世钰老师带来的关于RL理论方面的详细课程,本课程深入浅出地介绍了RL的基础原理,前置技能只需要基础的编程能力、概率论以及一部分的高等数学,你听完之后会在大脑里面清晰的勾勒出RL公式推导链条中的每一个部…

数据结构_时间复杂度

✨✨所属专栏:数据结构✨✨ ✨✨作者主页:嶔某✨✨ 什么是时间复杂度? 时间复杂度的定义:在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。一个算法执行所耗费的时间&#xff0…

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

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

发现肺结节怎么办?5个肺结节诊疗病例分享

近期“肺结节离癌症有多远”上了热搜,当体检报告上出现“肺结节”,不少朋友都万分焦虑。其实,直径小于8mm的实性肺结节不需要做手术,但要记得定期复诊看肺结节是往良性还是往恶性发展;如果是直径大于8mm的实性肺结节就…

Git 使用 下载分支 提交新项目到当前分支 三(公司快速上手版)

文章背景 git已经装好了,公司的也给创建好账户了,仓库地址也有了。 领导已经给你说了是哪个分支了。 如何下载远程仓库中的一个项目分支,到本地电脑上。 并且如何将新建的项目上传到当前分支的远程仓库 下载 步骤 创建文件夹。 右键 Op…

前端JS必用工具【js-tool-big-box】,Number数值转换的方法调用学习

这一小节,我们针对前端工具包(npm)js-tool-big-box的使用做一些讲解,主要是针对Number数值型转换的一些方法使用。 目录 前言 1 安装和引入 2 千位逗号分割 3 判断是否大于0 4 判断是否大于0的整数 5 生成指定范围内的随机数…

Win32 API 光标隐藏定位和键盘读取等常用函数

Win32 API 光标隐藏定位和键盘读取等常用函数 一、Win32 API二、控制台程序指令modetitlepausecls 三、控制台屏幕上坐标的结构体COORD四、句柄获取函数GetStdHandle五、控制台光标操作1.控制台光标信息结构体CONSOLE_CURSOR_INFO2.得到光标信息函数GetConsoleCursorInfo3. 设置…

【Java数据结构】深入解析ArrayList与顺序表

【Java数据结构】深入解析ArrayList与顺序表 1.前言~🥳🎉🎉🎉 2.ArrayList的介绍 3.使用ArrayList 3.1 ArrayList的构造方法 3.11 第一个构造方法 3.12第二个构造方法 3.13第三个构造方法 3.2ArrayList中的tostring方…

Spring IOC(一)

1. Spring IOC入门 1.1 什么是Spring IoC IoC(Inversion of Control),即控制反转,是一种设计原则。简单来说,IoC就是将程序的某种传统控制流程反转了。 在Spring框架中,控制反转体现在对象的创建和管理上。…

jsp servlet 学生信息管理系统

一、角色划分 1、超级管理员 2、学生 二、模块展示 1、登录 2、列表页面【超级管理员展示所有用户信息、学生只展示当前登录用户信息】 3、新增 4、编辑 三、数据库【mysql】 四、运行演示 jsp servlet 学生信息管理系统

rust疑难杂症解决

rust疑难杂症解决 边碰到边记录,后续可能会逐步增加,备查 cargo build时碰到 Blocking waiting for file lock on package cache 原因是Cargo 无法获取对包缓存的文件锁, 有时vscode中项目比较多,如果其中某些库应用有问题&…

CSS 之 transition过渡动画

一、简介 ​ CSS 制作 Web 动画有两种方式: 帧动画(Keyframe Animation)和过渡动画(Transition Animation)。针对不同的业务场景中,我们应该选择不同的动画方式,通常来说:对于交互元…

vue3插槽的name和v-slot的研究

slot可以分为具名插槽和默认,默认插槽name是default 在父组件的template需要些v-slot/#,没写不生效,而在父组件下,而没被template包含的默认放在template且含有#default. 1)没写slot,可以不写template,也可写default的template2)写了name的slot,即使是default也必须些template…

STM32G431RBT6之LCD与LED配置

首先,配置时钟树,时钟树的配置在我的另外一篇博客里,这里不再赘述. LCD与LED具有共同的IO口,同时创建工程较好. 打开原理图,发现LED的IO口是PC8~PC15,还有一个容易看漏的PD2.LCD的IO口是PC0到PC15. 当然,看产品手册也可以知道,但是还是推荐大家看原理图. 打开cubumx,给PC0~PC…

Java设计模式 _结构型模式_过滤器模式

一、过滤器模式 1、过滤器模式 过滤器模式(Filter Pattern)是这一种结构型设计模式。过滤器,顾名思义,就是对一组数据进行过滤,从而最终获取到我们预期的数据。 2、实现思路 (1)、定义过滤器的…

想要应聘前端工程师——学习路线指南

前端工程师学习路线 按照前端岗位需求,以优先学习工作更需要,面试更常考的内容为原则,由浅入深,层层铺垫,与时俱进,可以较容易地总结出前端学习路线图: HTML / CSS / JavaScript 基础学习 《Web 入门》 MDN 权威入门指南,HTML / CSS / JavaScript 快速上手 《CSS 世界…

华为OD机试 - 密码解密(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

ChatGPT/GPT4 科研实战教程-包括论文写作、数据分析、科研绘图、PPT制作,程序开发

从2022年3月,OpenAI公司发布chatGPT3.5开始,以ChatGPT为代表的人工智能内容生成技术(简称AIGC)引起了广泛关注,我们进入了全民AI时代。 因此,我们需要了解和掌握AI思维,才能更好适应这个时代的…

uniapp微信小程序-分享

https://developers.weixin.qq.com/miniprogram/dev/component/button.html https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/share.html#%E4%BD%BF%E7%94%A8%E6%8C%87%E5%BC%95 参考未整理 自定义参考未整理