当前位置: 首页 > news >正文

图像处理之 Gamma LUT

免责声明:

本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下,作者不对因使用本文内容而导致的任何直接或间接损失承担责任,包括但不限于数据丢失、业务中断或其他经济损失。

读者在使用本文信息时,应自行验证其准确性和适用性,并对其使用结果负责。本文内容不构成专业技术咨询或建议,具体的技术实现和应用应根据实际情况和需要进行详细分析和验证。

本文所涉及的任何商标、版权或其他知识产权均属于其各自的所有者。若本文中引用了第三方的资料或信息,引用仅为学术交流目的,不构成对第三方内容的认可或保证。

若有任何疑问或需进一步信息,请联系本文作者或相关专业人士。

目录

前言

一、Overview

伽马压缩 (γ < 1):

伽马扩展 (γ > 1):

二、Maximum Frequencies

三、Common Interface Signals

四、Data Interface

Video Data

五、Register Space

CONTROL (0x0000) Register

ACTIVE_WIDTH (0x0010) Register

ACTIVE_HEIGHT (0x0018) Register

VIDEO_FORMAT (0x0020) Register

六、Customizing and Generating the Core



前言

伽马校正的核心在于匹配图像数据的存储与传输与人眼感知的非线性特性,以及显示器的非线性输出特性。通过这种校正,我们可以在有限的信号范围内(如 8 位 RGB 分量)更有效地分配亮度值,从而优化图像的视觉质量。


一、Overview

在讨论伽马校正时,输入和输出值通常被归一化到 0 到 1 之间。伽马校正的过程通过一个幂函数来进行调整,这个幂函数的形式为:

其中,γ(伽马值)决定了校正的方式:

  1. 伽马压缩 (γ < 1):

    • γ 小于 1 时,输入的低亮度值在经过幂函数后会变得更大,而高亮度值的变化较小。
    • 这种情况通常用于编码图像数据,称为伽马压缩,因为它压缩了高亮度范围,使得暗部的细节更加明显,适合人眼的感知特性。
    • 例如,γ = 0.5 时,函数表现为开平方,将低亮度部分“拉伸”,使得暗部区域的亮度提高,更容易被人眼区分。
  2. 伽马扩展 (γ > 1):

    • γ 大于 1 时,输入的低亮度值经过幂函数后会变得更小,高亮度值的变化较大。
    • 这种情况通常用于显示设备中,称为伽马扩展,因为它扩展了暗部的亮度范围,以恢复到原始的线性关系。
    • 例如,γ = 2.2 时,函数压缩了低亮度部分,恢复显示器的非线性特性,确保图像显示的亮度与原始的视觉感受相一致。

如果你看 Figure 1-1,会看到不同的 γ 值对亮度值的映射曲线。对于 γ < 1,曲线更接近输出的上部,表示压缩了高亮度区间;对于 γ > 1,曲线更接近输出的下部,表示扩展了暗部区间。

伽马校正可以通过查找表(LUT)实现。LUT 是预先计算好的映射表,输入数据直接通过查表获得伽马校正后的输出结果。

  • LUT 大小由输入数据的位宽决定,例如 8 bit数据需要 256 个。

这种方法加快了实时处理速度,因为不需要每次都进行复杂的计算,只需查表即可。

二、Maximum Frequencies

三、Common Interface Signals

The AP_CLK and AP_RST_N signals are shared between the core, the AXI4-Stream data 
interfaces, and the AXI4-Lite control interface. 

四、Data Interface

 TotalDataWidth=3*data_width*samples_per_clock.

Video Data
  • TDATA 宽度要求:AXI4-Stream 接口规定 TDATA 的宽度必须是 8 位的整数倍。因此,如果你有例如 10 位宽的数据,在连接到 s_axis_video_tdata 之前,必须通过在最高有效位(MSB)填充零来扩展数据宽度,使其成为 8 位的倍数(如 16 位)。

  • 填充零的影响:这种填充零的操作不会影响核(core)的大小。也就是说,虽然增加了数据宽度,但这只是为了符合接口规范,不会对实际的硬件资源使用产生额外影响。

  • 输出数据处理:同样地,Gamma LUT 核心的输出数据 m_axis_video_tdata 也需要打包并填充零到 8 位的倍数。尤其对于 10 位宽的数据,这种填充是必要的。

  • 图示说明:图 2-2 和图 2-3 展示了在每时钟周期传输两个像素、每个颜色分量 10 位的数据配置下,AXI4-Stream 接口的像素映射情况。虽然图中没有展示,但最高有效位的零填充位(即 [63:60] 位)在实际应用中是存在的

五、Register Space

The core has seven core-specific registers which allow you to dynamically control the 
operation of the core. All registers have an initial value of 0. Table 2-4 describes the register 
names.

CONTROL (0x0000) Register
  • Bit[0] - ap_start:

    • 用于启动 IP 核。写 1 到此位会启动 IP 核,开始生成视频帧。
  • Bit[1] - ap_done:

    • 表示当前事务完成。当此位为 1 时,表示 IP 核已经完成了所有操作。
  • Bit[2] - ap_idle:

    • 指示 IP 核是否处于空闲状态。当此位为 1 时,表示 IP 核处于空闲状态,未执行任何操作。
  • Bit[3] - ap_ready:

    • 表示 IP 核是否准备好接收新的输入。当此位为 1 时,表示 IP 核已经完成了当前事务的所有输入读取,可以接受新输入。
  • Bit[7] - auto_restart:

    • 用于启用自动重启模式。当此位被设置为 1 时,IP 核在每次事务结束后会自动重新启动。

ACTIVE_WIDTH (0x0010) Register
  • active_width 寄存器:

    • 用于指定每行的有效像素数,即图像的宽度(每行的像素数量)。
  • 支持的值:

    • 该寄存器的值可以是 64 或者在 Vivado IDE 中配置的最大列数值(即设计时指定的图像最大宽度)。
  • 注意事项:

    • 为避免处理错误,写入 active_width 的值必须在 IP 核实例支持的范围内。

ACTIVE_HEIGHT (0x0018) Register
  • active_height 寄存器:

    • 用于指定每帧的有效扫描行数,即图像的高度(帧中的行数)。
  • 支持的值:

    • 该寄存器的值可以在 64 到 Vivado IDE 中配置的最大行数值(即设计时指定的图像最大高度)之间。
  • 注意事项:

    • 为避免处理错误,写入 active_height 的值必须在 IP 核实例支持的范围内。

VIDEO_FORMAT (0x0020) Register

This register specifies the video format of the AXI4-Stream Video data.

  • • 0x0 RGB video format
  • • 0x1 YUV 4:4:4 video format

六、Customizing and Generating the Core

  • Samples Per Clock

    • 定义:每个时钟周期处理的像素数量。允许的值是 1、2、4 和 8。
    • 作用:该参数决定了 IP 核的吞吐量。每个时钟周期处理更多像素意味着更高的吞吐量,但同时也需要更多的硬件资源。
  • Maximum Data Width

    • 定义:输入像素的位宽。允许的值是 8 位或 10 位。
    • 作用:该参数应与连接到从属 AXI4-Stream 视频接口的视频 IP 核的“视频组件宽度”相匹配。这意味着输入数据的位宽必须与其他视频处理模块兼容。
  • Maximum Number of Columns

    • 定义:IP 核能够在运行时生成的最大视频列/像素数。
    • 作用:任何小于此最大列数的视频宽度都可以通过 AXI4-Lite 控制接口编程,而无需重新生成 IP 核。这提供了灵活性,可以根据需求调整视频宽度。
  • Maximum Number of Rows

    • 定义:IP 核能够在运行时生成的最大视频行数。
    • 作用:任何小于此最大行数的视频高度都可以通过 AXI4-Lite 控制接口编程,而无需重新生成 IP 核。这同样提供了调整视频高度的灵活性



http://www.mrgr.cn/news/1889.html

相关文章:

  • Ubuntu虚拟机服务器的搭建
  • qt-11基本对话框(消息框)
  • Python基础知识学习总结(五)
  • 夏季炎热,宠物化身掉毛大王,猫咪浮毛异味问题该如何解决?
  • C#:基本语法
  • Vue+SortableJs实现拖拽排序
  • 《深入理解 Java 接口》
  • 【区块链+金融服务】广电融汇通供应链金融平台 | FISCO BCOS应用案例
  • 如何从Mac 电脑恢复已删除的文件
  • pygame开发课程系列(7):打砖块,飞行射击,跳跃游戏实例开发
  • Linux安装MQTT 服务器(图文教程)
  • AI作画提示词(Prompts)工程:技巧与最佳实践
  • uniapp中节点信息的使用
  • 华三(H3C)UIS3030 Uni-R4900服务器硬件监控指标解读
  • 工业匠芯 | 匠芯创科技工业级芯片D21X、D13X、D12X、G73X选型应用
  • Conditional Flow Matching: Simulation-Free Dynamic Optimal Transport论文阅读笔记
  • 照片整理专家,照片整理大师,照片图库整理,智能图片整理软件
  • GEC6818开发板的学习
  • 【微信小程序】自定义组件 - 组件的生命周期
  • Python实现GAN(生成对抗网络)图像修复算法