史蒂夫与MATLAB图像处理

图像处理的概念、算法和MATLAB

更多的实验和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]));
rgb_out = 1×3
0.6414 0.0001 0.3316
colorSwatches (rgb_out)
平等的
(函数 colorSwatches 是来自 使用MATLAB数字图像处理 ,它包含在 MATLAB代码文件的书 。)
当我们试图找到一个高色度的颜色,在同一色相角,光明,而不是黑暗?
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账户登录或创建一个新的。