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

Python实现图像曝光归一化的技术方案咨询(图像相似度项目)

书籍拍摄图像的曝光归一化实现方案(Python)

针对你提到的书籍拍摄图像曝光不均(过曝/欠曝)的问题,我整理了几种在Python中实现曝光归一化的实用方法,包括你初始设想的朴素像素处理,以及更专业的直方图均衡、伽马校正等方案,供你参考:

一、朴素像素值缩放法(对应你的初始思路)

这种方法核心是把图像的像素值线性拉伸到[0, 255]的标准范围,适合整体曝光偏暗或偏亮的图像,实现起来非常直观:

import cv2
import numpy as np

def naive_exposure_normalization(img):
    # 转换为浮点型避免计算溢出
    img_float = img.astype(np.float32)
    # 获取当前像素的最小和最大值
    min_pixel = np.min(img_float)
    max_pixel = np.max(img_float)
    # 线性缩放至0-255区间
    normalized_img = ((img_float - min_pixel) / (max_pixel - min_pixel)) * 255
    # 转回8位无符号整数格式
    return normalized_img.astype(np.uint8)

# 示例用法
over_exposed_img = cv2.imread("over_exposed_book_photo.jpg")
normalized_over = naive_exposure_normalization(over_exposed_img)

二、全局直方图均衡化

如果你的图像不仅曝光有问题,对比度也偏低,全局直方图均衡化会重新分配像素的亮度值,让图像的亮度分布更均匀,提升整体视觉效果:

def global_hist_eq(img):
    # 彩色图像需先转灰度处理,再转回彩色
    if len(img.shape) == 3:
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        eq_gray = cv2.equalizeHist(gray_img)
        return cv2.cvtColor(eq_gray, cv2.COLOR_GRAY2BGR)
    # 灰度图像直接处理
    else:
        return cv2.equalizeHist(img)

# 处理过曝图像
eq_over_exposed = global_hist_eq(over_exposed_img)

三、自适应直方图均衡化(CLAHE)

如果书籍图像存在局部曝光差异(比如边缘阴影、中心过亮),全局均衡化可能会丢失细节,这时CLAHE(限制对比度自适应直方图均衡化)会把图像分成多个小块分别处理,避免过度增强噪声:

def clahe_normalization(img, clip_limit=2.0, grid_size=(8,8)):
    # 创建CLAHE对象,clip_limit限制对比度增强幅度
    clahe = cv2.createCLAHE(clipLimit=clip_limit, tileGridSize=grid_size)
    if len(img.shape) == 3:
        gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        eq_gray = clahe.apply(gray_img)
        return cv2.cvtColor(eq_gray, cv2.COLOR_GRAY2BGR)
    else:
        return clahe.apply(img)

# 处理过曝图像
clahe_over_exposed = clahe_normalization(over_exposed_img)

四、伽马校正

伽马校正通过调整图像的伽马值来精准控制亮度,适合针对性地提亮欠曝图像或压暗过曝图像,效果非常可控:

def gamma_correct(img, gamma=1.0):
    # 构建伽马映射表
    inv_gamma = 1.0 / gamma
    gamma_table = np.array([((i / 255.0) ** inv_gamma) * 255
                            for i in np.arange(0, 256)]).astype("uint8")
    # 应用映射表到图像
    return cv2.LUT(img, gamma_table)

# 压暗过曝图像(伽马值<1)
darkened_over = gamma_correct(over_exposed_img, gamma=0.5)
# 提亮欠曝图像(伽马值>1)
brightened_under = gamma_correct(under_exposed_img, gamma=2.0)

方法选择建议

  • 若图像只是整体曝光偏差,朴素缩放或伽马校正足够简单高效;
  • 若需要同时提升对比度,全局直方图均衡化适合光照均匀的图像;
  • 若图像局部亮度差异明显,CLAHE能更好地保留细节,避免过度增强。

内容的提问来源于stack exchange,提问作者duhaime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:47:17