调整两张图片的饱和度对比度等一致

背景:

使用模型标注两张识别对象时,由于模型识别精确度不高,两张几乎相同的图片(不同天气拍的同一地点),识别出的目标不同,重新训练模型需要大量时间精力,所以通过调整两张图片来提高识别精度

思路:

通过调整使两张图片的亮度、对比度、色彩丰富度、清晰度、饱和度一致

代码:
from PIL import Image, ImageStat, ImageEnhance
import colorsys
from PIL import Image, ImageFilter
import numpy as np


def calculate_brightness(image):
    """计算图片的平均亮度"""
    stat = ImageStat.Stat(image.convert('L'))  # 'L' 表示转换为灰度
    return stat.mean[0]


def calculate_contrast(image):
    """计算图片的对比度,这里使用标准差作为对比度的一个简易度量"""
    stat = ImageStat.Stat(image.convert('L'))
    return stat.stddev[0]


def calculate_colorfulness(image):
    """计算图像的色彩丰富度"""
    # 转换为 HSV 色彩模式
    hsv_image = image.convert('HSV')
    # 计算颜色标准差
    stat = ImageStat.Stat(hsv_image)
    return stat.stddev[1] + stat.stddev[2]


def calculate_sharpness(image):
    """计算图像的清晰度"""
    # 使用Prewitt算子进行边缘检测
    edges = image.filter(ImageFilter.FIND_EDGES)
    # 将图像转换为灰度图
    gray_image = edges.convert('L')
    # 转换图像为NumPy数组
    array = np.array(gray_image)
    # 计算图像的清晰度,使用梯度的均方差作为清晰度度量
    gradient = np.gradient(array)
    sharpness = np.mean(gradient)
    return sharpness


def calculate_saturation(image):
    """计算图像的饱和度"""
    # 将图像转换为HSV颜色空间
    hsv_image = image.convert('HSV')
    # 获取图像的宽度和高度
    width, height = hsv_image.size
    # 初始化饱和度总和
    total_saturation = 0

    # 遍历图像的每个像素
    for y in range(height):
        for x in range(width):
            # 获取像素的HSV值
            h, s, v = hsv_image.getpixel((x, y))
            # 将饱和度值转换为0-1范围
            saturation = s / 255.0
            # 将饱和度值累加到总和中
            total_saturation += saturation

    # 计算平均饱和度
    average_saturation = total_saturation / (width * height)
    return average_saturation


def match_brightness(image, target_brightness):
    """调整图片亮度以匹配目标亮度"""
    current_brightness = calculate_brightness(image)
    factor = target_brightness / current_brightness
    enhancer = ImageEnhance.Brightness(image)
    return enhancer.enhance(factor)


def match_contrast(image, target_contrast):
    """调整图片对比度以匹配目标对比度"""
    current_contrast = calculate_contrast(image)
    factor = target_contrast / current_contrast
    enhancer = ImageEnhance.Contrast(image)
    return enhancer.enhance(factor)


def match_colorfulness(image, target_colorfulness):
    """调整图像的色彩丰富度以匹配目标色彩丰富度"""
    current_colorfulness = calculate_colorfulness(image)
    factor = target_colorfulness / current_colorfulness
    enhancer = ImageEnhance.Color(image)
    return enhancer.enhance(factor)


def match_sharpness(image, target_sharpness):
    """调整图像的清晰度以匹配目标清晰度"""
    current_sharpness = calculate_sharpness(image)
    factor = target_sharpness / current_sharpness
    enhancer = ImageEnhance.Sharpness(image)
    return enhancer.enhance(factor)


def match_saturation(image, target_saturation):
    """调整图像的饱和度以匹配目标饱和度"""
    current_saturation = calculate_saturation(image)
    factor = target_saturation / current_saturation
    enhancer = ImageEnhance.Color(image)
    return enhancer.enhance(factor)

# 加载图片
image1 = Image.open('stage/overlap_region1.jpg')
image2 = Image.open('stage/overlap_region2.jpg')

# 计算平均亮度和对比度
avg_brightness = (calculate_brightness(image1) + calculate_brightness(image2)) / 2
avg_contrast = (calculate_contrast(image1) + calculate_contrast(image2)) / 2
# 计算平均色彩丰富度、清晰度和饱和度
avg_colorfulness = (calculate_colorfulness(image1) + calculate_colorfulness(image2)) / 2
avg_sharpness = (calculate_sharpness(image1) + calculate_sharpness(image2)) / 2
avg_saturation = (calculate_saturation(image1) + calculate_saturation(image2)) / 2
# 调整图片以匹配平均亮度和对比度
matched_image1 = match_brightness(image1, avg_brightness)
matched_image1 = match_contrast(matched_image1, avg_contrast)
matched_image1 = match_colorfulness(matched_image1, avg_colorfulness)
matched_image1 = match_sharpness(matched_image1, avg_sharpness)
matched_image1 = match_saturation(matched_image1, avg_saturation)

matched_image2 = match_brightness(image2, avg_brightness)
matched_image2 = match_contrast(matched_image2, avg_contrast)
matched_image2 = match_colorfulness(matched_image2, avg_colorfulness)
matched_image2 = match_sharpness(matched_image2, avg_sharpness)
matched_image2 = match_saturation(matched_image2, avg_saturation)

# 保存或显示结果
matched_image1.save('matched_image1.jpg')
matched_image2.save('matched_image2.jpg')
结果:

拿到调整后的图片重新识别,效果还是不好,还是需要通过调整模型识别精确度来达到目的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值