You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 08:42:01