Color theory 根据图像中区域的已知HSV调整颜色(使用ImageMagick或类似工具)

Color theory 根据图像中区域的已知HSV调整颜色(使用ImageMagick或类似工具),color-theory,Color Theory,这是一个关于如何使用ImageMagick或类似工具对图像进行颜色校正的问题 我们有一张带有CMYK样本的图像。该样本打印在无光泽的白卡纸上,我们测量了青色的HSV(在现实生活中)在预先确定的照明条件下。然后,我们将这个样本放在我们拍摄的其他图像的前景中的卡片上。因为其他图像都有不同的照明条件,我们无法客观地识别图像中其他对象的颜色 是否有一种方法,使用ImageMagick或类似方法,在整个图像中移动HSV值,使用青色作为基础,以便图像中的颜色或其他对象反射的值与其在与CMYK样例相同的照明条

这是一个关于如何使用ImageMagick或类似工具对图像进行颜色校正的问题

我们有一张带有CMYK样本的图像。该样本打印在无光泽的白卡纸上,我们测量了青色的HSV(在现实生活中)在预先确定的照明条件下。然后,我们将这个样本放在我们拍摄的其他图像的前景中的卡片上。因为其他图像都有不同的照明条件,我们无法客观地识别图像中其他对象的颜色

是否有一种方法,使用ImageMagick或类似方法,在整个图像中移动HSV值,使用青色作为基础,以便图像中的颜色或其他对象反射的值与其在与CMYK样例相同的照明条件下拍摄的值相似

简言之,我们的目标是能够以一定的精度确定HSV,比如“黄色”(没有足够的光线,它可能看起来是橙色或棕色)


我发现有几篇文章建议使用一些技术来做类似的事情,但与我们在这里尝试做的完全不同。

这里有两种使用ImageMagick和Unix工具的简单方法

输入图像(来自)

1) 从中获取参考青色

分离r、g和b值

cyan_ref_r=`echo $cyan_ref | cut -d\  -f1`
cyan_ref_g=`echo $cyan_ref | cut -d\  -f2`
cyan_ref_b=`echo $cyan_ref | cut -d\  -f3`
cyan_mea_r=`echo $cyan_mea | cut -d\  -f1`
cyan_mea_g=`echo $cyan_mea | cut -d\  -f2`
cyan_mea_b=`echo $cyan_mea | cut -d\  -f3`
2) 从图像中裁剪一个小矩形,并获得青色斑块的平均测量颜色

分离r、g和b值

cyan_ref_r=`echo $cyan_ref | cut -d\  -f1`
cyan_ref_g=`echo $cyan_ref | cut -d\  -f2`
cyan_ref_b=`echo $cyan_ref | cut -d\  -f3`
cyan_mea_r=`echo $cyan_mea | cut -d\  -f1`
cyan_mea_g=`echo $cyan_mea | cut -d\  -f2`
cyan_mea_b=`echo $cyan_mea | cut -d\  -f3`
3) 将差异计算为百分比(相对于255)

4) 转换图像:

convert ftc_typ_sm.jpg \
-channel r -evaluate add $red_pct% +channel \
-channel g -evaluate add $green_pct% +channel \
-channel b -evaluate add $blue_pct% +channel \
ftc_typ_sm_corrected_rgb.jpg

现在您有了一个校正后的图像,可以从图表或图像中测量任何其他颜色

如果您的图像是cmyk,则对c、m、y、k执行相同的操作,或转换为RGB并执行上述操作

或者,您可以在HCL颜色空间中执行此操作:

1) 从中获取参考青色 并转化为HCL(或HSL或HSV等)


分离h、c、l值

cyan_ref_h=`echo "$cyan_ref_hcl" | cut -d\  -f1`
cyan_ref_c=`echo "$cyan_ref_hcl" | cut -d\  -f2`
cyan_ref_l=`echo "$cyan_ref_hcl" | cut -d\  -f3`
cyan_mea_h=`echo "$cyan_mea_hcl" | cut -d\  -f1`
cyan_mea_c=`echo "$cyan_mea_hcl" | cut -d\  -f2`
cyan_mea_l=`echo "$cyan_mea_hcl" | cut -d\  -f3`
2) 测量青色样本并将平均值转换为HCL

cyan_mea=`convert cyan_measure.png -scale 1x1! -format "%[pixel:u.p{0,0}]" info:`
echo "$cyan_mea"
srgb(2,147,187)

cyan_mea_hcl=`convert xc:"$cyan_mea" -colorspace HCL -format "%[pixel:u.p{0,0}]" info: | tr -cs "[0-9]*\n" " " | sed 's/^[ ]*//'`
echo "$cyan_mea_hcl"
193 73 42

分离h、c、l值

cyan_ref_h=`echo "$cyan_ref_hcl" | cut -d\  -f1`
cyan_ref_c=`echo "$cyan_ref_hcl" | cut -d\  -f2`
cyan_ref_l=`echo "$cyan_ref_hcl" | cut -d\  -f3`
cyan_mea_h=`echo "$cyan_mea_hcl" | cut -d\  -f1`
cyan_mea_c=`echo "$cyan_mea_hcl" | cut -d\  -f2`
cyan_mea_l=`echo "$cyan_mea_hcl" | cut -d\  -f3`
3) 计算差异并更改为适用于-modulate的值(请参阅)


4) 处理图像


要获得更准确的方法:

1) 对所有样本执行RGB方法,并计算平均R、G、B差异

2) 使用HCL法计算平均H、C、L差值


3) 执行相同的操作,但根据图像和参考表中每个色块的输入和输出值对,计算每个红色、绿色和蓝色(或色调、色度、亮度)通道的查找表。

一个想法是将图像转换为HSL或HSV或HCL。将校准的青色样例转换为相同的颜色空间。然后找出3个颜色通道值(H、S或C、L或V)之间的差异。然后将图像转换为sRGB,使用-modulate将图像按该差值左右移动。然后将结果转换回CMYK(假设您的输入是CMYK)。请注意,-modulate的值范围为0到200,100为零。因此,您需要适当地转换H、S或C以及L或V值。H是硬的,因为它的范围从0到360。如果您需要帮助,请告诉我。继续:您也可以通过H、S或C、L或V通道中的加法或乘法将值移位,并转换回原始颜色空间。在得到两个青色区域的H、S或C、L或V、色差或比率后再这样做。哇,很好的答案(但我不能把它标记为答案,因为你把它们写成了注释)。这对我来说太新鲜了,我需要一段时间来测试这些建议。如果您可以提供一个具体的示例,包括一个示例图像和所需的代码,这将非常有帮助。非常感谢。如果您为实际图像或其中的一部分提供足够的色样周围区域,以便在处理后判断其是否合理,则效果会更好。制作一个假货很难判断它是否有效。如果图像是专有的,我们可以设置一个dropbox进行交换。让我知道或提供您的直接电子邮件。续:如果图像不是专有的,并且您由于特权无法在此发布图像,那么您可以发布到一些免费托管服务,并将URL放在您的帖子中。
cyan_h_diff=$((cyan_ref_h-cyan_mea_h))
cyan_c_diff=$((cyan_ref_c-cyan_mea_c))
cyan_l_diff=$((cyan_ref_l-cyan_mea_l))
echo "cyan_h_diff=$cyan_h_diff; cyan_c_diff=$cyan_c_diff; cyan_l_diff=$cyan_l_diff;"
cyan_h_diff=-2; cyan_c_diff=-13; cyan_l_diff=-3;

modh=`convert xc: -format "%[fx:100+$cyan_h_diff*200/360]" info:`
modc=$((100+cyan_c_diff))
modl=$((100+cyan_l_diff))
echo "modh=$modh; modc=$modc; modl=$modl"
modh=98.8889; modc=87; modl=97
convert ftc_typ_sm.jpg -define modulate:colorspace=HCL -modulate $modh,$modc,$modl ftc_typ_sm_corrected_hcl.jpg