从暗到亮,从模糊到清晰:FPGA图像处理亮度和对比度的魔法调节

本文转载自:FPGA入门到精通

图像处理中的亮度和对比度调节是改善图像视觉效果的重要手段之一,可以改善图像的视觉效果,以适应不同的应用场景和用户需求。

本文将介绍亮度和对比度调节的原理、常见算法、Python实现以及FPGA实现。

一、图像亮度和对比度调节介绍

1、图像亮度和对比度的定义

(1)亮度

亮度是指图像的光度学或感觉上的属性,它涉及到图像的明亮程度。

亮度的高低取决于图像所反射或发射的光线强度。在图像中,亮度通常用cd/m²(坎德拉每平方米)或nits来量化。

一个亮度高的图像看起来会更明亮,但过高的亮度可能会导致图像失去细节,甚至造成视觉疲劳。同时,亮度的调整也要考虑图像的对比度,以保持图像的舒适观看和色彩的准确表现。

(2)对比度

对比度则是描述图像中最亮和最暗部分之间的差异程度。

高对比度的图像具有更清晰的明暗界限,能够展现出更多的细节和层次。

对比度的变化对图像的视觉效果影响很大,高对比度使得图像更加鲜明和生动,而低对比度则使图像看起来更加柔和,但同时也可能让图像显得平淡缺乏立体感。

简单来说,亮度是图像的光度水平,决定了图像的明暗程度;对比度则是图像中明暗变化的程度,决定了图像的清晰度和细节表现。两者的平衡和适当的调节对于图像的质量和视觉效果至关重要。

2、亮度和对比度调节的方法

(1)线性亮度和对比度调节

通过对每个像素的亮度进行相同系数的增加或减少,来整体提高或降低图像的亮度。

这种方法简单,但可能会导致图像细节的丢失。

线性算法的公式如下:

Out = In * alpha + beta

其中,Out表示调整后的亮度值,In表示原始亮度值,alpha表示增益,用来控制对比度,beta表示偏置,用来控制亮度。

(2)非线性亮度和对比度调节

采用非线性函数对图像的亮度进行调整,以更精细地处理图像的亮度变化,通常会考虑图像的局部信息和整体信息,来提高调节的效果。

非线性亮度调节通常涉及到一个映射函数,这个函数将原始图像的像素值映射到新的像素值,以此来改变图像的亮度。

映射函数通常是复杂的,它可以是任何形式,包括但不限于幂律(例如Gamma校正),对数,指数,或是其他更复杂的数学函数。

在图像处理中,非线性亮度调节通常使用伽马变换(Gamma Correction)来实现。

伽马变换的公式为:

O = I^(1/γ) 或 O = I^γ

其中,I代表输入像素的亮度值,O代表输出像素的亮度值,γ代表伽马值。这个公式实际上是对输入像素的亮度值进行幂运算,通过调整伽马值来改变图像的亮度。

具体来说:

1. 当γ小于1时,图像的高亮度区域将被压缩而低亮度区域将被扩展,从而使图像变亮。这种变换对于增强暗部细节非常有用。

2. 当γ大于1时,图像的低亮度区域将被压缩而高亮度区域将被扩展,从而使图像变暗。这种变换对于防止高亮区域过度曝光非常有效。

3. 当γ等于1时,伽马变换变为线性变换,即输入和输出亮度值相等,图像亮度保持不变。

伽马变换可以有效地调整图像的对比度和亮度,特别是在暗部和亮部区域。

由于人眼对不同亮度的敏感度是非线性的,因此伽马变换被广泛应用于图像处理和显示设备中,以实现更自然、更逼真的图像视觉效果。

在实际应用中,通常需要根据具体的图像内容和处理需求来选择合适的伽马值进行亮度调节。

3、对比度与亮度的关系

亮度是图像的光度水平,决定了图像的明暗程度;对比度则是图像中明暗变化的程度,决定了图像的清晰度和细节表现。

对比度的调整通常也会用到类似的算法,如阈值处理和像素值的映射。

二、Python实现

import cv2
import numpy as np

img = cv2.imread('1280_720.bmp')

cv2.namedWindow("original", 0)
cv2.resizeWindow("original", 300, 180) # 设置窗口大小
cv2.imshow('original', img)

# 图像变量
img_bright = (img * 1.5).clip(0, 255).astype(np.uint8)

# 图像变暗
img_dark = (img * 0.2).clip(0, 255).astype(np.uint8)

# 显示图像
cv2.imshow("original", img)

cv2.namedWindow("bright", 0)
cv2.resizeWindow("bright", 300, 180) # 设置窗口大小
cv2.namedWindow("dark", 0)
cv2.resizeWindow("dark", 300, 180) # 设置窗口大小
cv2.imshow('bright', img_bright)
cv2.imshow('dark', img_dark)

cv2.waitKey(0)
cv2.destroyAllWindows()

效果:

三、FPGA实现

分析线性亮度调节公式可以发现,亮度调节主要涉及乘法和加法的运算,实现起来很简单。

另外亮度和对比度的变换,通过图片直接看可能很难区分,可以通过亮度直方图来对比,就很好理解。

最新文章