opencv-python图像增强六:低光照增强

一:简介

低光照图像增强是一种图像处理技术,旨在改善在低光照条件下拍摄的图像的质量。这种技术可以提高图像的亮度、对比度和细节,使其更易于人类视觉系统或后续图像分析任务使用。

二、低光照图像增强方案:

本方案采用图像增强技术以提升图像亮度。首先,对所获取的低光照图像进行噪声消除处理,有效移除大部分暗部噪声。随后,对去噪后的图像实施自适应直方图均衡化,以增强图像的细节与纹理表现。最后,将图像转换至HSV色彩空间,并对V通道(代表亮度)施加伽马变换,以进一步强化图像的亮度水平。

三、算法实现步骤

3.1 CLAHE直方图均衡化:

CLAHE(Contrast Limited Adaptive Histogram Equalization)是一种自适应直方图均衡化的变种,它通过在传统直方图均衡化的基础上增加对比度限制机制,以避免对比度过高和噪声的放大。CLAHE的主要步骤包括将图像分割成多个小区域,计算每个区域的局部直方图,对直方图进行均衡化处理以增强对比度,并在均衡化过程中通过对比度限制参数来控制每个区域的动态范围,以防止对比度过高。最后,调整每个区域的像素值并合并所有处理过的区域,得到最终增强后的图像。这种方法可以更好地保留图像的局部对比度,特别是在图像中存在大范围亮度变化时,能够在每个区域独立处理对比度,同时通过对比度限制机制减少噪声的放大.
为了放大图像细节以及防止图像失真参数全选为1

代码实现:

def hisEqulColor2(imga):
    ycrcb = cv2.cvtColor(imga, cv2.COLOR_BGR2YCR_CB)
    channels = cv2.split(ycrcb)
    clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(1, 1))
    clahe.apply(channels[0], channels[0])
    cv2.merge(channels, ycrcb)
    cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, imga)
    return imga

3.2 伽马变换:

伽马变换(Gamma Transformation)是一种非线性变换,广泛应用于图像处理和计算机视觉领域。伽马变换通过调整像素值来改善图像的对比度和亮度,使其更符合人类视觉系统的感知特性。
代码实现:

def gamma_trans(img, gamma):
    """
    对图像进行gamma变换处理。
    参数:
    img: 输入图像
    gamma: 伽马值
    返回:
    gamma变换后的图像
    """
    gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
    return cv2.LUT(img, gamma_table)

代码首先创建了一个伽马表(gamma_table),该表包含256个元素,每个元素代表输入图像中一个灰度级的变换后的值。通过列表推导式,代码计算了每个灰度级(从0到255)在伽马变换后的值。具体来说,每个灰度级 x 的伽马变换后的值由公式 np.power(x / 255.0, gamma) * 255.0 计算得出,其中 gamma 是用户提供的伽马值。为了适应OpenCV的LUT函数,代码将伽马表从浮点数类型转换为整数类型,首先使用np.round函数将浮点数转换为最接近的整数,然后通过astype(np.uint8)函数将数组转换为无符号8位整数类型。最后,使用cv2.LUT函数将输入图像的像素值与伽马表中的值进行查找和替换,实现伽马变换。

3.3 对亮度通道做伽马变换

根据Retinex理论,光照条件对物体本身的属性,如颜色、纹理等特征,并无直接影响。因此,在执行伽马变换时,应避免对图像的颜色信息进行处理,以防止颜色失真。为此,通常将图像转换至HSV色彩空间,仅对代表亮度的V通道进行伽马增强,从而实现对图像亮度的调节,同时保持原始的颜色信息不受干扰。
实现方法:

hsv_image = cv2.cvtColor(img_equ, cv2.COLOR_BGR2HSV)

# 获取V通道
v_channel = hsv_image[:, :, 2]
# 应用gamma变换
v_channel_gam = gamma_trans(v_channel, 0.3)
hsv_image[:, :, 2] = v_channel_gam
bgr_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)

四:整体代码实现

import numpy as np
import cv2

# 定义引导滤波函数

# 定义gamma变换函数
def gamma_trans(img, gamma):
    """
    对图像进行gamma变换处理。
    参数:
    img: 输入图像
    gamma: 伽马值
    返回:
    gamma变换后的图像
    """
    gamma_table = [np.power(x / 255.0, gamma) * 255.0 for x in range(256)]
    gamma_table = np.round(np.array(gamma_table)).astype(np.uint8)
    return cv2.LUT(img, gamma_table)

# 定义直方图均衡化函数
def hisEqulColor2(imga):
    """
    直方图均衡化处理。
    参数:
    imga: 输入图像
    返回:
    直方图均衡化后的图像
    """
    ycrcb = cv2.cvtColor(imga, cv2.COLOR_BGR2YCR_CB)
    channels = cv2.split(ycrcb)
    clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(1, 1))
    clahe.apply(channels[0], channels[0])
    cv2.merge(channels, ycrcb)
    cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, imga)
    return imga

# 定义路径
path = r"D:\54.png"
# 读取图像
img = cv2.imread(path)

# 应用双边滤波
img_bil = cv2.bilateralFilter(img,5,15,15)
# 应用直方图均衡化
img_equ = hisEqulColor2(img_bil)

hsv_image = cv2.cvtColor(img_equ, cv2.COLOR_BGR2HSV)

# 获取V通道
v_channel = hsv_image[:, :, 2]
# 应用gamma变换
v_channel_gam = gamma_trans(v_channel, 0.4)
hsv_image[:, :, 2] = v_channel_gam
bgr_image = cv2.cvtColor(hsv_image, cv2.COLOR_HSV2BGR)
# 显示结果
cv2.imshow("img_equ", bgr_image)
cv2.waitKey(0)

五,效果:

左侧为增强前,右侧为增强后
在这里插入图片描述

  • 12
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值