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

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

关键说明

  1. 保留色彩:读取原图时使用cv.IMREAD_COLOR,确保RGB色彩信息完全保留。
  2. 自然校正:用除法归一化的方式,暗角区域(模板值低)会被自动提亮,亮区基本保持不变,明暗过渡自然,不会像减法那样出现色彩断层。
  3. 精度保障:采用浮点运算避免整数除法的截断误差,保证校正后的色彩和亮度准确。

另外要注意,PNG是无损格式,验证时一定要使用原始PNG文件,别用转成JPEG的图,否则会影响校正效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:15:34