PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换

news2025/1/11 17:58:46

什么是图像的log变换?

总的来说,对数变换是一种常用的图像增强技术,可以改善图像的视觉质量、减少噪声以及突出图像中的细节,从而提高图像在视觉感知和分析中的效果和可用性。

图像的对数变换(log transformation)是一种用于增强图像对比度的常见方法之一。它通过对图像的像素值取对数来扩展较低亮度的区域,并压缩较高亮度的区域,从而增强图像的细节和对比度。

对数变换的主要特点是可以扩展图像的暗部细节,使得低亮度区域的像素值被映射到较大的范围内,从而提高了图像的对比度。然而,对数变换对于较亮的区域的影响相对较小,可能会导致亮度信息的丢失。

对数变换常用于图像处理中的动态范围压缩、图像增强、去噪等应用中。

为什么要做图像的log变换?

对图像进行对数变换的主要目的有几个:

  1. 增强对比度:对数变换可以扩展图像的灰度动态范围,将较低灰度值的区域拉伸,同时压缩较高灰度值的区域,从而增强图像的对比度。这对于某些图像来说,特别是那些灰度范围较窄的图像,可以使图像更具视觉效果。

  2. 压缩动态范围:在一些应用中,图像的动态范围可能过大,包含了大量的细节信息。对数变换可以帮助压缩图像的动态范围,使得图像中的细节更容易被观察和分析。

  3. 减少噪声:在图像处理中,对数变换也可以用于减少图像中的噪声。由于对数函数的曲线特性,对低灰度值的像素施加更大的变换,因此可以将低灰度值的噪声信号压缩到较小的范围内,从而减少图像中的噪声影响。

  4. 增强图像细节:对数变换有助于突出图像中的细节和纹理,特别是对于暗部细节。这使得图像在观察和分析时更容易捕捉到细微的变化和特征。

log变换的公式

对于灰度图像,图像的对数变换公式如下:

其中,r 表示原始图像的像素值,s 表示变换后的像素值,c 是一个常数,用于调节变换后的亮度范围。其中 c 为常数系数, r 为像素值范围 0~255。

(生成这个交互式曲线图的python代码在文章的后面有提供)

如图所示, 对数曲线在像素值较低的区域斜率较大, 像素值较高的区域斜率比较低, 所以图像经过对数变换之后, 在较暗的区域对比度将得到提升, 因而能增强图像暗部的细节。

python实现图像的log变换

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段代码会读取名为 Lena.jpg 的图片文件,将其转换为灰度图像,并应用 log 变换。然后,它会显示原始图像、灰度图像和经过 log 变换后的图像。

可以看到图像的暗部被明显提升了。

matlab实现实现图像的log变换

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换-Anlogic-安路论坛-FPGA CPLD-ChipDebug

这段 MATLAB 代码实现了相同的功能,包括读取图像、将图像转换为灰度图像、应用对数变换以及显示原始图像、灰度图像和对数变换后的图像。

FPGA工程解析

工程数据流图

工程层次图

代码解析

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

img_log u_img_log

(

.i_clk(clk_pixel),

.i_rst_n(sys_rst_n),

.i_hs(VGA_HS),

.i_vs(VGA_VS),

.i_de(VGA_DE),

.i_r(VGA_RGB[23:16]),

.i_g(VGA_RGB[15:8]),

.i_b(VGA_RGB[7:0]),

.o_hs(log_hs),

.o_vs(log_vs),

.o_de(log_de),

.o_r(log_data[23:16]),

.o_g(log_data[15:8]),

.o_b(log_data[7:0])

);

对于FPGA做log运算最好的办法是我们先用matlab或者python把 c*log(0~255)的值计算并输出到文本文件中,然后填入log_rom.v这个文件中即可。下面的代码提供了直接输出log_rom.v的功能,分别提供了pyton版本和matlab版本,代码中c取30

pyton版本

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换-Anlogic-安路论坛-FPGA CPLD-ChipDebug

matlab版代码

PotatoPie 4.0 实验教程(22) —— FPGA实现摄像头图像对数(log)变换-Anlogic-安路论坛-FPGA CPLD-ChipDebug

此 MATLAB 代码将执行与Python版代码相同的操作,并生成相同的 COE 文件和图像。

因此FPGA中只需要读出log的值即可,


log_rom u_r

(

.clka (i_clk ),

.addra (i_r ),

.ena (1'b1 ),

.douta (o_r )

);

由于是纯组合逻辑,行场信号都不需要延一拍直接输出即可。

assign o_hs = i_hs;

assign o_vs = i_vs;

assign o_de = i_de;

管脚约束

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

时序约束

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

实验结果

还是以咱们的小金猪作为主角。

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

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

相关文章

xLua详解

目录 环境准备xLua导入 C#调用LuaLua解析器Lua文件加载重定向Lua解析管理器全局变量的获取全局函数的获取List和Dictionary映射table类映射table接口映射tableLuaTable映射table Lua调用C#准备工作Lua使用C#类Lua调用C#枚举Lua使用C# 数组 List 字典数组List字典 Lua使用C#扩展…

锂电池SOH预测 | 基于CNN-GRU的锂电池SOH预测(matlab)

锂电池SOH预测 锂电池SOH预测完整代码锂电池SOH预测 锂电池的SOH(状态健康度)预测是一项重要的任务,它可以帮助确定电池的健康状况和剩余寿命,从而优化电池的使用和维护策略。 SOH预测可以通过多种方法实现,其中一些常用的方法包括: 容量衰减法:通过监测电池的容量衰减…

图像处理ASIC设计方法 笔记19 连通域标记ASIC系统设计

目录 核心的模块有:标记ASIC的工作流程如下:该芯片的系统结构具有如下特点:P131 第6章 连通域标记与轮廓跟踪 本章节讲述了多值分割图像连通域标记芯片的系统设计 多值分割图像连通域标记芯片(以下简称"标记芯片",也称"标记 ASIC"),完成图像连通域标…

PotatoPie 4.0 实验教程(27) —— FPGA实现摄像头图像拉普拉斯边缘提取

拉普拉斯边缘提取有什么作用? 拉普拉斯边缘检测是一种常用的图像处理技术,用于检测图像中的边缘和边界。它的主要作用包括: 边缘检测:拉普拉斯算子可以帮助检测图像中的边缘,即图像中亮度快速变化的位置。这些边缘通常…

MAC有没有免费NTFS tuxera激活码 tuxera破解 tuxera for mac2023序列号直装版 ntfs formac教程

Tuxera NTFS 2023破解版是一款非常好用的在线磁盘读写工具,该软件允许mac用户在Windows NTFS格式的硬盘上进行读写操作,Mac的文件系统是HFS,而Windows则使用NTFS格式,这导致在Mac系统上不能直接读写Windows格式的硬盘。然而&#…

什么ISP是住宅IP,和普通IP有什么区别?

ISP(Internet Service Provider)即互联网服务提供商,是向广大用户综合提供互联网接入业务、信息业务和增值业务的电信运营商。住宅IP,也称为家庭IP,是指由ISP分配给家庭或个人用户的IP地址。这些IP地址是真实的&#x…

【深度学习】Yolov8使用心得

兜兜转转,原本以为和yolov没啥关系了,但是新公司又回到了yolov侧。 yolov8 可以用pip的方式安装,以package的三方软件包形式,隐藏了很多细节。当然你也可以从git上把全套代码down下来。 1.分类模型 1.1 改错误 位置&#xff1a…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器,用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统,支持各种编程语言和工具。 Jenkins是一款开…

boot https ssl 使用http协议访问报错

在springboot中配置ssl以后, 再次使用http访问对应的接口就会报错 可以考虑如下设置,将http访问的端口重定向到https对应的端口 import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util…

分段函数拟合-施加分段点连续约束条件|【Matlab源码+视频介绍】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

CISSP通关学习笔记:共计 9 个章节(已完结)

1. 笔记说明 第 0 章节为开篇介绍,不包括知识点。第 1 - 8 章节为知识点梳理汇总,8 个章节的知识框架关系如下图所示: 2. 笔记目录 「 CISSP学习笔记 」0.开篇「 CISSP学习笔记 」1.安全与风险管理「 CISSP学习笔记 」2.资产安全「 CISSP…

MIPS32 指令架构

指令格式 R 类型 说明: 用于寄存器和寄存器操作 参数说明: Op: 指令操作码Rs: 第一个源操作数寄存器号,参与运算使用Rd: 目的操作数寄存器号,保存结果使用Shamt: 位偏移量,仅在位移指令使用,在此直接置0Func: 指令函…

MF(推荐系统的矩阵分解技术)论文笔记

论文概述 推荐系统的矩阵分解技术可以为用户提供更为准确的个性化推荐,对比传统的近邻技术,矩阵分解技术可以纳入更多信息,如隐式反馈、时间效应和置信度 近邻技术:基于用户或物品之间的相似性进行推荐,当用户之间已…

【java数据结构之八大排序(上)-直接插入排序,希尔排序,选择排序,堆排序,向下调整(大根堆,小根堆)等知识详解】

🌈个人主页:努力学编程’ ⛅个人推荐:基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 …

RabbitMQ知识点总结(一)

为什么要使用RabbitMQ? 异步,解耦,削峰。 异步 提高效率;一个挂了,另外的服务不受影响。 解耦 增加或减少服务比较方便。 削峰 每天0点到16点,A系统风平浪静,每秒并发数量就100个。结果每次到了16点到…

[笔试强训]day3

1.简写单词 题目链接&#xff1a;简写单词_牛客题霸_牛客网 思路&#xff1a;利用scanf读取特性&#xff0c;因为scanf是以空格&#xff0c;换行或者文件末尾为结束标志。 代码&#xff1a; #include <iostream> using namespace std;int main() {char str[100] {0}…

使用Python进行自动化部署

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行自动化部署 在软件开发和运维领域&#xff0c;自动化部署是一个至关重要的环…

创建electron,解决包清理的问题,解决镜像源卡住下载时间长

我的电脑用户名是Anyphasy,我的node.js安装在D:\developp\nodejss18.18.0 使用npm config get prefix查看node.js安装路径 npm config get prefix 创建electron 创建package.json文件,它里面记载了你的electron版本,项目描述,以及启动命令等信息 npm init -y 先查看你自己的…

OpenHarmony语言基础类库【@ohos.util.List (线性容器List)】

List底层通过单向链表实现&#xff0c;每个节点有一个指向后一个元素的引用。当需要查询元素时&#xff0c;必须从头遍历&#xff0c;插入、删除效率高&#xff0c;查询效率低。List允许元素为null。 List和[LinkedList]相比&#xff0c;LinkedList是双向链表&#xff0c;可以…

【3GPP IAB】 3GPP支持IAB架构概述

1 概述 IAB用于回传链路的无线传输&#xff0c;对于NR高频尤其重要&#xff0c;3GPP协议讨论了IAB的可能架构和部署方式&#xff0c;一起来看看吧。 2 IAB 功能和接口 IAB尽量重用为接入定义的现有功能和接口。特别是&#xff0c;移动终端(MT)、gNB- DU、gNB- CU、UPF、AMF和S…