当下信息技术迅速发展,其中图像信息在各个领域都得到了广泛的应用,同时对图像也需要更高的图像质量和更准确的图像信息。在部分拍摄条件下,由于自然环境存在复杂的光照条件,如:阴雨天、地下环境、夜晚的拍摄环境,得到的图像会受到较差的光照条件的限制,此类在光照不足条件下拍摄的图像称为低照度图像。低照度环境下得到的图像会存在较高的噪声,且存在纹理信息模糊、对比度低、色彩还原不正确等问题,不仅会导致视觉观感上收获较差,也会在图像信息传递上产生一些错误,给后续的图像处理造成一定的困难。
当前的低照度图像增强的方法主要有两种,一是传统的图像增强方法,可分为空域、频域和混合域三类,通过对图像的像素值直接进行空间域上处理的方法,如直方图均衡以及伽马变换;像小波变换一样通过变换域进行频域处理的操作;以及结合前两种方法而进行的混合与方法。二是基于深度学习的图像增强的方法,例如:零参考深度曲线估计(Zero-Reference Deep Curve Estimation,Zero-DCE)的核心是其轻量级的神经网络模型,该模型无需任何手动调整的参数,仅通过学习来自大量数据集的照明和对比度变化,就能自适应地增强图像。
传统低照度图像增强在一定程度上可以提高视觉效果和图像信息的准确传输,但是存在过程复杂、时间较长、亮度调整不灵活、色彩失真、细节丢失等问题。与之相比,基于深度学习的低照度图像增强可以通过大规模数据提取得到更强的适应性、鲁棒性、处理速度。其中,鲁棒性是指系统或算法在非正常状况、噪声、其他变化的条件下的的稳定能力。具体来说,这指的就是系统在面对各种异常情况时能够保持稳定的能力。
1.直方图均衡化
直方图均衡化的基本原理是对灰度值图像的各个像素的灰度级进行再分配,使得图像整体像素分布的灰度平均化,从而增强整体的对比度。该方法通过对图像的像素值进行变换,拉伸或压缩原始图像的像素值范围,使得图像的直方图更加平坦,从而达到图像的增强效果。该方法的使用可以提高图像像素的对比度、去除光照不均匀,适用于灰度图像和低照度图像。然而,直方图均衡化容易导致图像过度增强或细节丢失的问题,对于低照度图像的增强效果有限,对于噪声较多的图像,直方图均衡化可能会增强噪声,需结合去噪处理。Python代码如下:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread("7.jpg")
B, G, R = cv2.split(img) # get single 8-bits channel
b = cv2.equalizeHist(B)
g = cv2.equalizeHist(G)
r = cv2.equalizeHist(R)
equal_img = cv2.merge((b, g, r)) # merge it back
hist_b = cv2.calcHist([equal_img], [0], None, [256], [0, 256])
hist_B = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.subplot(1, 2, 1)
plt.plot(hist_B, 'b')
plt.title('原图B通道的直方图', fontdict={'family': 'KaiTi', 'size': 10})
plt.subplot(1, 2, 2)
plt.title('均衡化后B通道的直方图', fontdict={'family': 'KaiTi', 'size': 10})
plt.plot(hist_b, 'b')
plt.show()
cv2.imwrite("image.jpg", equal_img)
cv2.imshow("orj", img)
cv2.imshow("equal_img", equal_img)
cv2.waitKey(0)
结果图如下,左图为低照度图像,右图为直方图均衡化增强后的图像:
2.伽马变换
在低照度图像增强中,伽马变换的原理是通过对图像的灰度值进行非线性变换,以提高图像的对比度和清晰度。在低照度条件下,图像的亮度可能较低,细节不够清晰。通过应用伽马变换,可以调整图像的灰度级别,使得暗部细节更加突出,整体图像变得更清晰。伽马变换可以增强图像的局部对比度,使图像更具有视觉吸引力和信息量。Python代码如下:
import numpy as np
import matplotlib.pyplot as plt
import cv2
img = cv2.imread('image1.jpg')
img = img.astype(np.float32) / 255.0
def gamma_correction(img, gamma):
return np.power(img, gamma)
gamma = 0.5
img_gamma = gamma_correction(img, gamma)
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('原图像', fontdict={'family': 'KaiTi', 'size': 10})
plt.subplot(1, 2, 2)
plt.imshow(cv2.cvtColor(img_gamma, cv2.COLOR_BGR2RGB))
plt.title('伽马变换后图像', fontdict={'family': 'KaiTi', 'size': 10})
plt.show()
cv2.imwrite("image2.jpg", img_gamma * 255) # 保存伽马变换后的图像
结果图如下,左图为低照度图像,右图为伽马变换增强后的图像:
3.Retinex算法
Retinex理论:Retinex算法的好处是光正常情况下不会使得图像中各个像素相对的亮度关系产生影响,并且可以使得收到光照影响的图像质量得以改善其影响程度,借此增强图片的效果,让整体图片的视觉效果更好。其基本思想是去除照射光影响,保留物体自身的反射属性,再调整对比度和亮度,主要包括单尺度视网膜算法(Singal Scale Retinex,SSR)、多尺度视网膜算法(Multi-Scale Retinex,MSR)和带色彩恢复的多尺度视网膜增强算法(Multi-Scale Retinex with Color Restoration,MSRCR)三种算法。Python代码如下:
import cv2
import numpy as np
# 对图像进行单尺度 Retinex 处理
def single_scale_retinex(img, sigma):
retinex = np.log10(img) - np.log10(cv2.GaussianBlur(img, (0, 0), sigma))
return retinex
# 对图像进行多尺度 Retinex 处理
def multi_scale_retinex(img, sigma_list):
retinex = np.zeros_like(img)
for sigma in sigma_list:
retinex += single_scale_retinex(img, sigma)
retinex = retinex / len(sigma_list)
return retinex
# 进行颜色恢复
def color_restoration(img, alpha, beta):
img_sum = np.sum(img, axis=2, keepdims=True)
color_restoration = beta * (np.log10(alpha * img) - np.log10(img_sum))
return color_restoration
# 图像增强主函数,包括图像增强和颜色恢复
def retinex_process(img, sigma_list, G, b, alpha, beta):
img = np.float64(img) + 1.0
img_retinex = multi_scale_retinex(img, sigma_list)
img_color = color_restoration(img, alpha, beta)
img_retinex = G * (img_retinex * img_color + b)
# 将像素值限制在范围内
for i in range(img_retinex.shape[2]):
img_retinex[:, :, i] = np.clip(img_retinex[:, :, i], 0, 255)
img_retinex = np.uint8(img_retinex)
return img_retinex
def main():
# 读取图像
img = cv2.imread('image1.jpg')
# 尺度列表
sigma_list = [15, 80, 250]
# 增益参数
G = 5.0
# 偏置参数
b = 25.0
# 颜色恢复参数
alpha = 125.0
# 颜色恢复参数
beta = 46.0
# 进行图像增强
img_retinex = retinex_process(img, sigma_list, G, b, alpha, beta)
# 显示原始图像
cv2.imshow('image1', img)
# 显示增强后的图像
cv2.imshow('Retinex', img_retinex)
# 等待按键
cv2.waitKey(0)
# 保存增强后的图片
cv2.imwrite('image2.jpg', img_retinex)
if __name__ == "__main__":
main()
结果图如下,左图为低照度图像,右图为伽马变换增强后的图像: