我还在摆弄RGB色域的计算
$ L^* a^* b^* $
空间。(请参阅我关于这个主题的上一篇文章,
"在实验室曲线中可视化色域外的颜色"
)今天的文章介绍了一些新的色域相关的可视化,以及一些涉及色域边界和射线的计算技巧
$ L^* a^* b^* $
空间。
首先,这是另一种表达色域内区域的方法
$ (a^*,b^*) $
平面随
$ l ^* $
(知觉轻)。对于9个
$ l ^* $
(10、20、……,90), I'll compute a 2-D
$ (a^*,b^*) $
色域面具的野蛮强制。然后,我将使用重叠等高线图来显示色域边界的变化。
[aa,bb,LL] = meshgrid(a,b,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],LineWidth=1.5,ShowText=true,...
这是另一个可视化概念。人们经常显示颜色的
$ (a^*,b^*) $
平面,给一个概念的意义
$ a^* $
而且
$ b^* $
,但这并不能很好地传达一个想法,即通常有多种颜色,对应于各种颜色
$ l ^* $
价值观,在任何一个
$ (a^*,b^*) $
的位置。下面,我分别显示最亮的色域内颜色和最暗的色域内颜色
$ (a^*,b^*) $
的位置。
[L_min (p, q), L_max (p, q)] = Lrange (aa (p, q), bb (p, q));
rgb = lab2rgb(cat(3,L_max,aa,bb));
imshow(rgb,XData=a([1 end]),YData=b([1 end]))
rgb_min = lab2rgb(cat(3,L_min,aa,bb));
imshow(rgb_min,XData=a([1 end]),YData=b([1 end]))
接下来,我发现自己有时想要画一条射线
$ L^* a^* b^* $
空间,找到沿射线的色域边界位置。为此,我写了一个简单的效用函数(
findNonzeroBoundary
下图),它执行二分搜索来查找函数从正到0的位置。然后,我写了一些匿名函数来寻找所需的色域边界点。具体来说,我对这个问题很感兴趣:对于给定的
$ l ^* $
值和给定值
$ (a^*,b^*) $
平面的角度,
h
,最大色度的色域内颜色是什么,
c
,或距离
$ (0,0) $
在
$ (a^*,b^*) $
飞机吗?
合理的警告
:下面的代码在匿名函数中变得很棘手。你可能会讨厌它。如果是这样,我完全理解,我希望你能原谅我。: -)
我将从创建一个匿名函数开始
L^* c h $
来
$ L^* a^* b^* $
:
lch2lab = @(禄)[禄(1)华尔街日报(2)* cosd(华尔街日报(3)华尔街日报(2)*信德(华尔街日报(3)));
接下来,这里是一个匿名函数,返回是否有一个特定的
$ L^* a^* b^* $
点在色域内。
inGamut = @(lab) all(0 <= lab2rgb(lab),2) & all(lab2rgb(lab) <= 1,2);
最后,使用第三个匿名函数
findNonzeroBoundary
找到我感兴趣的色域边界点。
maxChromaAtLh = @(L,h) findNonzeroBoundary(@(c) inGamut(lch2lab([L ch]))), 0, 200);
让我们练习这个函数来找到一个高色度的深色
$ h=0^{\circ} $
.
这就是那个颜色的样子。
rgb_out = lab2rgb(lch2lab([L ch]));
当我们试图找到一个高色度的颜色,在相同的色相角度,是明亮的而不是黑暗的,会发生什么?
你可以看到最大值
c
的价值要低得多
$ l ^* $
.它看起来像什么?
rgb_out = lab2rgb(lch2lab([L ch]));
当我做这些实验来准备这篇博客文章时,我最初的目的只是展示几个不同值的例子
h
而且
$ l ^* $
.但我停不下来!这太有趣了,我一直在尝试不同的价值观。
大约15分钟后,我决定最好写一些简单的循环来生成相对大量的
$ (L^*,h) $
看看这些组合。这是产生快感的代码
c
颜色多样
$ (L^*,h) $
组合。
c = maxChromaAtLh(L(q),h(k));
rgb(k,q,:) = lab2rgb(lch2lab([L(q) ch (k)]));
这是在网格上查看所有这些颜色的代码,带标签
h
而且
$ l ^* $
轴。
Rgb2 =重塑(fliplr(rgb),[],3);
p = colorSwatches(rgb2,[length(L) length(h)]);
p.XData = (p.XData - 0.5) * (dh/1.5) + h(1);
p.YData = (p.YData - 0.5) * (dL/1.5) + L(1);
效用函数
函数[L_min,L_max] = Lrange(a,b)
Gamut_mask = all((0 <= rgb) & (rgb <= 1),2);
J = find(gamut_mask,1,“第一”);
K = find(gamut_mask,1,“最后一次”);
函数x = findnonzerobboundary (f,x1,x2,abstol)
abstol(1,1) {mustBeFloat}= 1的军医
如果(f(x1) == 0) || (f(x2) ~= 0)
如果Abs (xm - x1) / max(Abs (xm), Abs (x1)) <= abstol
x = findnonzerobboundary (f,x1,xm);
x = findnonzerobboundary (f,xm,x2);
评论
如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。