如何计算感知色差
一世写之前对新colorChecker,可以检测R2020B释放中的X-Rite测试图。另一个新的颜色相关功能区域是计算感知颜色差异。有新功能deltaE,它基于L*a*b*颜色空间和CIE76标准计算色差。还有imcolordiff.功能,可以根据CIE94或CIDE2000标准计算颜色差异。
我最近提到了一个关于图像处理工具箱团队的人,我计划写一个关于这些功能的博客文章,他提出了以下问题:哪两种颜色是最远的,感知上讲?我决定用$ \ delta_e $试用。我会以这种方式制定问题:哪两个SRGB颜色在它们之间有最大的$ \ delta_e $?
在2015年的相关帖子中,我展示了如何在L * A * B *空间中绘制SRGB色域面,如下所示:
看这张图,你也许能猜出答案。但是,让我们来解决这个问题。我想做的第一件事是对sRGB空间进行采样。
(r, g, b) = ndgrid (linspace (0, 1100));RGB = [r(:), g(:), b(:)];
接下来,将SRGB颜色转换为实验室。(我将停止键入“*”字符。)
Lab = RGB2LAB(RGB);
现在让我们在实验室值的凸壳上找到颜色。彼此远离的一对颜色必须均在凸壳上。
k = convhull(实验室);hull_colors = lab(唯一(k(:,1)),:);
如果这是一个二维问题,那么我知道可以在$ O(n)$中找到最遥远的点对的算法,其中$ n $是凸船上的点数。我不知道三维中类似的算法,因此我只是通过计算每个颜色对之间的距离来蛮力它。
那么,我们在谈论多少颜色?
大小(hull_colors)
答案:3
有3908种颜色,每个颜色由实验室空间中的3个元素向量表示。颜色差异$ \ delta_e $是实验室空间中两种颜色之间的欧几里德距离。我想计算该集合和其他颜色的每种颜色之间的距离。以下是使用MATLAB算术运算符的隐式扩展行为来做漂亮和紧凑的方法。
C1 =重塑(hull_colors, [], 1, 3);C2 =重塑(hull_colors 1 [], 3);Cdiff = C1 - C2;德=√sum (Cdiff。^ 2,3));大小(德)
ans = 3980 3980
你可以看到德是3980x3980矩阵。它包含所有凸壳颜色之间的一对距离。(也可以看看PDIST2.,统计和机器学习工具箱中的功能可以计算成对的矢量距离,更灵活,以及hyp,这是一个MATLAB函数,以避免数值溢出和底流问题的方式计算二元矢量的大小。)
我们来找出矩阵中的最大距离。
[m,n] = find(DE == max(DE(:)))
m = 3883 92 n = 92 3883
这些颜色是什么(在实验室空间中)?
max_colors_lab = hull_colors (m,:)
Max_colors_lab = 32.2970 79.1875 -107.8602 87.7347 -86.1827 83.1793
sRGB空间中的这两种颜色:
max_colors_rgb = lab2rgb(max_colors_lab)
MAX_COLORS_RGB = 0.0000 -0.0000 1.0000 0.0000 1.0000 0.0000
他们只是sRGB的绿色和蓝色初选。
Colorswatches(MAX_COLORS_RGB)轴平等的轴从
(Colorswatches.是A.DIPUM3E中提供给您的函数MATLAB颜色的工具在文件交换和上GitHub..)
这两种颜色有$ \ delta_e $:
德(m (1) n (1))
ans = 258.6827
delta函数提供了一种更方便的方法来计算$\Delta_E$:
delta ([0 0],[0 0 1])
ans = 258.6827
其他时间,我将写关于提供的其他色差计算imcolordiff.。
评论
要发表评论,请点击在这里登录您的MathWorks帐户或创建新的。