如何用OpenCV Python基于暗角模板去除图像暗角?
暗角去除的正确实现方案
你的代码有几个关键问题导致效果不符合预期:
- 读取
test.png时用cv.imread('test.png',0)直接转成了灰度图,原图像的色彩信息直接丢失,后续转BGRA也无法恢复色彩。 - 用
cv.subtract做减法操作,会导致暗区域色彩偏移,无法实现自然的明暗均匀。暗角本质是亮度衰减,得用亮度归一化的方式修正,而非直接减法。 - 对
vig-alpha.png的透明通道利用不当,暗角模板只需作为亮度参考即可,不需要依赖透明通道。
正确操作步骤和代码
准备工作
无需用GIMP生成透明图,直接用你去色后的vig-desat.png当暗角模板即可;要是还没去色,用代码直接处理vig-raw.png也可以。
核心代码(单图测试)
import cv2 as cv import numpy as np # 读取原彩色图,保留所有色彩信息 img = cv.imread('test.png', cv.IMREAD_COLOR) # 读取暗角模板(如果是vig-desat.png直接读灰度,若是vig-raw.png可后续转灰度) vig_template = cv.imread('vig-desat.png', cv.IMREAD_GRAYSCALE) # 确保模板和原图尺寸一致,不一致则缩放匹配 if vig_template.shape != img.shape[:2]: vig_template = cv.resize(vig_template, (img.shape[1], img.shape[0])) # 转浮点型避免整数运算溢出,同时防止除以0添加极小值 vig_float = vig_template.astype(np.float32) vig_float[vig_float == 0] = 1e-5 # 原图转浮点格式,分通道处理保证色彩不丢失 img_float = img.astype(np.float32) # 亮度归一化:原图除以模板,再乘模板的最大亮度,保证亮度范围正常 max_vig = np.max(vig_float) corrected = (img_float / vig_float[..., np.newaxis]) * max_vig # 把结果限制在0-255之间,转回8位整数格式 corrected = np.clip(corrected, 0, 255).astype(np.uint8) # 查看校正效果 cv.imshow('校正后图像', corrected) cv.waitKey() cv.destroyAllWindows()
批量处理750张图的代码
import os # 替换成你的原图文件夹路径和校正后图像保存路径 input_dir = '你的原图文件夹路径' output_dir = '校正后图像保存路径' os.makedirs(output_dir, exist_ok=True) # 预处理暗角模板,避免重复操作 vig_template = cv.imread('vig-desat.png', cv.IMREAD_GRAYSCALE) vig_float = vig_template.astype(np.float32) vig_float[vig_float == 0] = 1e-5 max_vig = np.max(vig_float) for filename in os.listdir(input_dir): if filename.endswith('.png'): img_path = os.path.join(input_dir, filename) img = cv.imread(img_path, cv.IMREAD_COLOR) # 缩放模板匹配当前图像尺寸 vig_resized = cv.resize(vig_float, (img.shape[1], img.shape[0])) # 执行校正 corrected = (img.astype(np.float32) / vig_resized[..., np.newaxis]) * max_vig corrected = np.clip(corrected, 0, 255).astype(np.uint8) # 保存校正后的图像 cv.imwrite(os.path.join(output_dir, f'corrected_{filename}'), corrected)
关键说明
- 保留色彩:读取原图时使用
cv.IMREAD_COLOR,确保RGB色彩信息完全保留。 - 自然校正:用除法归一化的方式,暗角区域(模板值低)会被自动提亮,亮区基本保持不变,明暗过渡自然,不会像减法那样出现色彩断层。
- 精度保障:采用浮点运算避免整数除法的截断误差,保证校正后的色彩和亮度准确。
另外要注意,PNG是无损格式,验证时一定要使用原始PNG文件,别用转成JPEG的图,否则会影响校正效果。
内容的提问来源于stack exchange,提问作者Jacob Rose
相关产品推荐
相关产品推荐

