更多的实验和sRGB色域边界在L * a * b *空间
我仍然和RGB色域计算
$ L ^ * ^ * ^ * $
空间。(参见我上一篇关于这个主题,
“可视化out-of-gamut颜色在实验室曲线。”
)今天的发布一些新的gamut-related可视化特性,加上一些计算技巧涉及范围边界和射线
$ L ^ * ^ * ^ * $
空间。
首先,这里是另一种交流的想法in-gamut区域
美元(a ^ * ^ *)美元
飞机随
L ^ * $美元
(知觉轻)。9的值
L ^ * $美元
(10年,20年,……,90), I'll compute a 2-D
美元(a ^ * ^ *)美元
域面具的蛮力。然后,我将用等高线图上显示色域边界的变化。
一个= -110:.1:110;
b = -110: .1:110;
L = 10:20:90;
(aa、bb、LL) = meshgrid (a、b L);
持有在
为k = 1:长度(L)
rgb = lab2rgb(猫(LL (:,:, k), aa (:,:, k), bb (:,:, k)));
掩码= ((0 < = rgb) & (rgb < = 1), 3) * 2 - 1 + L (k);
轮廓(a, b,面具,[L (k) L (k)], LineColor = [。8。8。8),线宽= 1.5,ShowText = true,…
LabelSpacing = 288)
结束
持有从
轴平等的
网格在
盒子在
包含(“*”)
ylabel (“b *”)
标题(“色域边界(a, b)飞机数的值L *”)
这是另一个可视化的概念。人们经常显示颜色
美元(a ^ * ^ *)美元
飞机,给一个想法的意义
$ ^ * $
和
^ * $ $ b
,但这并不很好沟通的想法,通常有多个颜色,对应于不同的
L ^ * $美元
值,在任何一个
美元(a ^ * ^ *)美元
的位置。下面,我将展示最亮的in-gamut颜色和黑暗in-gamut颜色在每个
美元(a ^ * ^ *)美元
的位置。
一个= 110:110;
b = 110:110;
(aa、bb) = meshgrid (a, b);
L_max = 0(大小(aa));
L_min = 0(大小(aa));
为p = 1:尺寸(aa, 1)
为q = 1:尺寸(bb, 1)
[L_min (p, q), L_max (p, q)] = Lrange (aa (p, q), bb (p, q));
结束
结束
rgb = lab2rgb(猫(3 L_max aa、bb));
图
tiledlayout (1、2)
nexttile
imshow (rgb, XData =([1]结束),YData = b(结束[1]))
轴xy
轴在
包含一个
ylabelb
标题(“聪明的in-gamut颜色”)
rgb_min = lab2rgb(猫(3 L_min aa、bb));
nexttile
imshow (rgb_min XData =([1]结束),YData = b(结束[1]))
轴在
轴xy
包含一个
ylabelb
标题(“黑暗in-gamut颜色”)
接下来,我发现自己有时想画一线
$ L ^ * ^ * ^ * $
空间和发现色域边界的位置沿射线。为此,我写了一个简单的效用函数(
findNonzeroBoundary
下图)执行一个二叉搜索找到一个函数从积极到0。然后,我写了一些匿名函数找到所需的色域边界点。具体地说,我很感兴趣这个问题:对于一个给定的
L ^ * $美元
值和给定的
美元(a ^ * ^ *)美元
平面的角度,
h
,什么是in-gamut颜色最大浓度,
c
,或距离
(0,0)美元
在
美元(a ^ * ^ *)美元
飞机吗?
合理的警告
:下面的代码变得棘手的匿名函数。你可能会讨厌它。如果是这样,我完全理解,我希望你能原谅我。:-)
我将首先创建一个匿名函数,转换
L ^ * c h美元
来
$ L ^ * ^ * ^ * $
:
lch2lab = @(禄)[禄(1)华尔街日报(2)* cosd(华尔街日报(3)华尔街日报(2)*信德(华尔街日报(3)));
接下来,这是一个匿名函数,返回是否一个特定的
$ L ^ * ^ * ^ * $
点范围。
inGamut = @(实验室)(0 < = lab2rgb(实验室),2)& (lab2rgb(实验室)< = 1、2);
最后,第三个匿名函数使用
findNonzeroBoundary
找到我感兴趣的色域边界点。
maxChromaAtLh = @ (L、h) findNonzeroBoundary (@ (c) inGamut (lch2lab ([L c h])), 0, 200);
让我们锻炼这个函数找到高色深色
美元h = 0 ^{\保监会}$
。
L = 35;
h = 0;
c = maxChromaAtLh (L、h)
c = 61.0229
这是那个颜色是什么样子的。
rgb_out = lab2rgb (lch2lab ([L c h]));
图
colorSwatches (rgb_out)
轴平等的
轴从
当我们试图找到一个高色度的颜色,在同一色相角,光明,而不是黑暗?
L = 90;
h = 0;
c = maxChromaAtLh (L、h)
c = 14.8666
你可以可以看到最大值
c
价值低得多的价值就越高
L ^ * $美元
。它看起来像什么?
rgb_out = lab2rgb (lch2lab ([L c h]));
图
colorSwatches (rgb_out)
轴平等的
轴从
当我在做这些实验准备这篇博客,我的初衷是给几个不同值的例子
h
和
L ^ * $美元
。但我不能停止!这太有趣,我总是在不同的值。
15分钟左右后,我决定最好是写一些简单的循环来生成一个相对大量的
(L ^ *, h)美元
组合。这是代码生成高
c
为各种不同的颜色
(L ^ *, h)美元
组合。
dh = 30;
h = -180: dh: 150;
L = 35:15:95;
dL = 15;
rgb = 0(长度(h)、长度(L), 3);
为q = 1:长度(L)
为k = 1:长度(h)
c = maxChromaAtLh (L (q), h (k));
rgb (k问:)= lab2rgb (lch2lab ([L (q) c h (k))));
结束
结束
这里是查看所有这些颜色的代码在一个网格,标记
h
和
L ^ * $美元
轴。
rgb2 =重塑(fliplr (rgb), [], 3);
p = colorSwatches (rgb2(长度(L)长度(h)));
p。XData = (p。XData - 0.5) * (dh / 1.5) + h (1);
p。YData = (p。YData - 0.5) * (dL / 1.5) + L (1);
xticks (h);
包含(“h”)
yticks(左)
ylabel (“L *”)
网格在
标题(“最高浓度(最饱和的)颜色不同的L *和h值”)
效用函数
函数[L_min, L_max] = Lrange (a, b)
参数
一个(1,1){mustBeFloat}
b(1,1){mustBeFloat}
结束
L = 0:0.01:100;
= *的(大小(L));
b = b *的(大小(L));
实验室= [L;一个;b];
rgb = lab2rgb(实验室);
gamut_mask = ((0 < = rgb) & (rgb < = 1), 2);
j =找到(gamut_mask 1“第一”);
k =找到(gamut_mask 1“最后一次”);
如果isempty (j)
L_min =南;
L_max =南;
其他的
L_min = L (j);
L_max = L (k);
结束
结束
函数x = findNonzeroBoundary (f, x1, x2, abstol)
参数
f(1,1)function_handle
x1(1,1){mustBeFloat}
x2(1,1){mustBeFloat}
abstol(1,1){mustBeFloat}= 1的军医
结束
如果(f (x1) = = 0) | | (f (x2) ~ = 0)
错误(”功能必须在初始非零起点和零初始终点。”)
结束
xm =意味着((x1, x2)));
如果abs (xm - x1) / max (abs (xm), abs (x1) < = abstol
x = x1;
elseif(f (xm) = = 0)
x = findNonzeroBoundary (f, x1, xm);
其他的
x = findNonzeroBoundary (f, xm x2);
结束
结束
评论
留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。