用MATLAB进行图像处理

图像处理概念,算法和MATLAB

L*a*b*空间中sRGB色域边界的更多实验

我还在摆弄RGB色域的计算 $ L^* a^* b^* $ 空间。(请参阅我关于这个主题的上一篇文章, "在实验室曲线中可视化色域外的颜色" )今天的文章介绍了一些新的色域相关的可视化,以及一些涉及色域边界和射线的计算技巧 $ L^* a^* b^* $ 空间。
首先,这是另一种表达色域内区域的方法 $ (a^*,b^*) $ 平面随 $ l ^* $ (知觉轻)。对于9个 $ l ^* $ (10、20、……,90), I'll compute a 2-D $ (a^*,b^*) $ 色域面具的野蛮强制。然后,我将使用重叠等高线图来显示色域边界的变化。
A = -110:. 1:10 0;
B = -110:. 1:10 10;
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],LineWidth=1.5,ShowText=true,...
LabelSpacing = 288)
结束
持有
平等的
网格
盒子
包含(“*”
ylabel (“b *”
标题(L*若干值在(a,b)平面上的色域边界
这是另一个可视化概念。人们经常显示颜色的 $ (a^*,b^*) $ 平面,给一个概念的意义 $ a^* $ 而且 $ b^* $ ,但这并不能很好地传达一个想法,即通常有多种颜色,对应于各种颜色 $ l ^* $ 价值观,在任何一个 $ (a^*,b^*) $ 的位置。下面,我分别显示最亮的色域内颜色和最暗的色域内颜色 $ (a^*,b^*) $ 的位置。
A = -110:110;
B = -110:110;
[aa,bb] = meshgrid(a,b);
L_max = 0 (size(aa));
L_min = 0 (size(aa));
P = 1:size(aa,1)
Q = 1:size(bb,1)
[L_min (p, q), L_max (p, q)] = Lrange (aa (p, q), bb (p, q));
结束
结束
rgb = lab2rgb(cat(3,L_max,aa,bb));
数字
tiledlayout(1、2)
nexttile
imshow(rgb,XData=a([1 end]),YData=b([1 end]))
xy
包含一个
ylabelb
标题(“色域内最亮的颜色”
rgb_min = lab2rgb(cat(3,L_min,aa,bb));
nexttile
imshow(rgb_min,XData=a([1 end]),YData=b([1 end]))
xy
包含一个
ylabelb
标题(“色域内最暗的颜色”
接下来,我发现自己有时想要画一条射线 $ 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} $
L = 35;
H = 0;
c = maxChromaAtLh(L,h)
C = 61.0229
这就是那个颜色的样子。
rgb_out = lab2rgb(lch2lab([L ch]));
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 ch]));
数字
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,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);
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;
a = a*ones(size(L));
b = b*ones(size(L));
实验室= [L;一个;b];
RGB = lab2rgb(实验室);
Gamut_mask = all((0 <= rgb) & (rgb <= 1),2);
J = find(gamut_mask,1,“第一”);
K = find(gamut_mask,1,“最后一次”);
如果isempty (j)
L_min = NaN;
L_max = NaN;
其他的
L_min = L(j);
L_max = L(k);
结束
结束
函数x = findnonzerobboundary (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 = mean([x1 x2]);
如果Abs (xm - x1) / max(Abs (xm), Abs (x1)) <= abstol
X = x1;
elseif(f(xm) == 0)
x = findnonzerobboundary (f,x1,xm);
其他的
x = findnonzerobboundary (f,xm,x2);
结束
结束
|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。