Cap*_*lfz 5 python opencv image-processing histogram
我目前正在尝试使用 OpenCV 确定我们的输出图像与使用 Python 绘制的莫奈画之间的色差。
通过我的研究,我发现 Delta E 是确定色差的最佳选择。我尝试使用提取两个图像的 BGR 通道,然后采用用于计算每个颜色通道差异的平均“蓝色”、“绿色”和“红色”颜色。
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))
Run Code Online (Sandbox Code Playgroud)
我收到每个颜色通道的色差输出,但是我的教授建议我可能做错了 Delta E,因为我应该只获得整个图像的色差值,而不是每个值三个颜色通道。在这种情况下,是否有替代方法或正确的方法来计算我们两个图像的 Delta E?
这是我们测试图像示例的链接:https : //imgur.com/a/KToggFS
以及绘画样本的链接:https : //imgur.com/a/vi1SFax
您似乎正在使用可以colormath很好地进行数学运算的库,但是速度很慢。该colour-science包使用 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)
Run Code Online (Sandbox Code Playgroud)
但请注意,如果您先转换为浮点数,您可能会获得更好的结果:
image_lab = cv2.cvtColor(image_rgb.astype(np.float32) / 255, cv2.COLOR_RGB2Lab)
Run Code Online (Sandbox Code Playgroud)
然后仅color-science用于delta_E()对每个像素的最终调用(但请注意,这些都是矢量化的,因此您只需将所有内容的数组都给它,它就会立即高效地完成所有工作):
import colour
delta_E = colour.delta_E(image1_lab, image2_lab)
Run Code Online (Sandbox Code Playgroud)
然后你可能想要整个图像的平均值:
np.mean(delta_E)
Run Code Online (Sandbox Code Playgroud)
但中位数、分位数或绘制分布会给你更多信息
请注意,如果您关心色彩空间并且需要更多地控制从 RGB 到 Lab 的转换,您可以使用 获得更多控制colour-science,粗略的模板如下所示:
image_lab = colour.XYZ_to_Lab(colour.sRGB_to_XYZ(image_srgb))
Run Code Online (Sandbox Code Playgroud)
并且有很多关于如何在此过程中进行此转换的选项,请参阅colour.XYZ_to_Lab和 的文档colour.XYZ_to_Lab。
| 归档时间: |
|
| 查看次数: |
3349 次 |
| 最近记录: |