gpt4 book ai didi

python - 如何使用 OpenCV 计算两个图像之间的 Delta E

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:47 59 4
gpt4 key购买 nike

我目前正在尝试使用 OpenCV 使用 Python 确定我们的输出图像与莫奈画作之间的色差。

根据我的研究,我发现 Delta E 是确定色差的最佳方法。我试过使用提取两个图像的 BGR channel ,然后采用用于计算每个颜色 channel 差异的平均“蓝色”、“绿色”和“红色”颜色。

output_chans = cv2.split(image)
monet_chans = cv2.split(best_painting)
colors = ("Blue", "Green", "Red")

for (output_chan, monet_chan, color) in zip(output_chans, monet_chans, colors):
output_mean = np.mean(output_chan)
monet_mean = np.mean(monet_chan)

color1_rgb = None
color2_rgb = None

if color == "Blue":
color1_rgb = sRGBColor(0.0, 0.0, output_mean)
color2_rgb = sRGBColor(0.0, 0.0, monet_mean)
elif color == "Green":
color1_rgb = sRGBColor(0.0, output_mean, 0.0);
color2_rgb = sRGBColor(0.0, monet_mean, 0.0);
elif color == "Red":
color1_rgb = sRGBColor(output_mean, 0.0, 0.0);
color2_rgb = sRGBColor(monet_mean, 0.0, 0.0);

# Convert from RGB to Lab Color Space
color1_lab = convert_color(color1_rgb, LabColor);

# Convert from RGB to Lab Color Space
color2_lab = convert_color(color2_rgb, LabColor);

# Find the color difference
delta_e = delta_e_cie2000(color1_lab, color2_lab);

print("Delta E of the Mean of %s Channel: %f" % (color, delta_e))

我收到每个颜色 channel 的色差输出,但是我的教授建议我可能做错了 Delta E,因为我应该只得到整个图像的色差值而不是一个值每三个颜色 channel 的值。在这种情况下,是否有替代方法或正确方法来计算我们两个图像的 Delta E?

这是我们测试图像示例的链接:https://imgur.com/a/KToggFS

以及绘画样本的链接:https://imgur.com/a/vi1SFax

最佳答案

您似乎正在使用 colormath 库,它可以很好地进行数学运算,但速度很慢。 colour-science package使用 numpy 向量化操作并在更短的时间内得到答案

您正在使用的 cv2 库具有您需要的一些转换的简单版本,例如您可以完成大部分工作:

import cv2

image1_rgb = cv2.imread('image1.jpeg')
image2_rgb = cv2.imread('image2.jpeg')

image1_lab = cv2.cvtColor(image1_rgb, cv2.COLOR_RGB2Lab)
image2_lab = cv2.cvtColor(image2_rgb, cv2.COLOR_RGB2Lab)

但请注意,如果先转换为 float ,您可能会获得更好的结果:

image_lab = cv2.cvtColor(image_rgb.astype(np.float32) / 255, cv2.COLOR_RGB2Lab)

然后只需使用 color-science 进行对 delta_E() 的最终调用对于每个像素(但请注意,这些都是矢量化的,所以你只需给它一个包含所有内容的数组,它就会同时高效地完成所有操作):

import colour

delta_E = colour.delta_E(image1_lab, image2_lab)

然后您可能需要整个图像的平均值:

np.mean(delta_E)

但是中位数、分位数或绘制分布图会为您提供更多信息

请注意,如果您关心色彩空间并且需要更多地控制从 RGB 到 Lab 的转换,您可以使用 colour-science 获得更多控制权,粗略的模板如下所示:

image_lab = colour.XYZ_to_Lab(colour.sRGB_to_XYZ(image_srgb))

并且有很多关于如何在此过程中进行此转换的选项,请参阅 colour.XYZ_to_Lab 的文档和 colour.XYZ_to_Lab .

关于python - 如何使用 OpenCV 计算两个图像之间的 Delta E,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57224007/

59 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com