背景:
使用模型标注两张识别对象时,由于模型识别精确度不高,两张几乎相同的图片(不同天气拍的同一地点),识别出的目标不同,重新训练模型需要大量时间精力,所以通过调整两张图片来提高识别精度
思路:
通过调整使两张图片的亮度、对比度、色彩丰富度、清晰度、饱和度一致
代码:
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')
结果:
拿到调整后的图片重新识别,效果还是不好,还是需要通过调整模型识别精确度来达到目的