如何使用Python OpenCV实现基于梯度的图像对比度与亮度调整
完全可以实现基于梯度的空间自适应亮度对比度调整,你目前用的cv2.convertScaleAbs是全局固定参数的调整方案,只要把固定的对比度增益alpha、亮度偏移beta替换为和你现有梯度图绑定的逐像素参数,就能实现越靠近右下角调整幅度越大、左上角画质好的区域几乎不调整的效果,完美适配你当前的图像光照衰减特征。
具体实现步骤
- 第一步:将你准备好的梯度图调整为和原图像完全一致的尺寸,再归一化到[0,1]区间。梯度值越接近1代表该区域需要的调整幅度越大(对应右下角画质差的区域),越接近0代表调整幅度越小(对应左上角画质好的区域)。
- 第二步:设定全局最大调整参数:
alpha_max为最大对比度增益(建议取值范围1.22.0,1代表无对比度调整),`beta_max`为最大亮度偏移(建议取值范围2060,0代表无亮度调整),两个参数可根据实际输出效果微调。 - 第三步:基于归一化后的梯度图生成逐像素的alpha、beta矩阵:
逐像素alpha = 1 + (alpha_max - 1) * 归一化梯度值 逐像素beta = beta_max * 归一化梯度值 - 第四步:对原图像逐通道做乘加运算,将结果截断到0~255区间后转8位无符号整型即可得到调整后的图像,你也可以循环调用
cv2.convertScaleAbs处理每个通道,效果完全一致。
可直接运行的代码示例
import cv2 import numpy as np # 读取输入图像和梯度图 src_img = cv2.imread("square2.jpeg") grad_mask = cv2.imread("diag_gradient.jpg", cv2.IMREAD_GRAYSCALE) # 保证梯度图和原图尺寸匹配 grad_mask = cv2.resize(grad_mask, (src_img.shape[1], src_img.shape[0])) # 梯度图归一化到0-1区间 grad_norm = grad_mask.astype(np.float32) / 255.0 # 调整参数,可根据效果自行修改 alpha_max = 1.7 beta_max = 45 # 生成逐像素调整参数 alpha_mat = 1 + (alpha_max - 1) * grad_norm beta_mat = beta_max * grad_norm # 逐通道调整 enhanced_img = np.zeros_like(src_img, dtype=np.float32) for channel in range(src_img.shape[2]): enhanced_img[..., channel] = src_img[..., channel] * alpha_mat + beta_mat # 截断数值到合法范围并转格式 enhanced_img = np.clip(enhanced_img, 0, 255).astype(np.uint8) # 保存结果 cv2.imwrite("enhanced_output.jpg", enhanced_img)
优化建议
如果调整后仍有残留的光照不均问题,可以额外增加一步*CLAHE(限制对比度自适应直方图均衡化)*处理:先将图像转换到HSV色彩空间,仅对V(亮度)通道做CLAHE处理后再转回BGR空间,能进一步弱化局部光照差异。
如果需要适配更多不同光照衰减的图像,也可以不用提前准备梯度图,直接对原图做大核高斯模糊得到估计的光照掩码,替换现有手动梯度图即可实现自适应调整。
内容的提问来源于stack exchange,提问作者Juliepvr
相关产品推荐
相关产品推荐

