用MATLAB进行图像处理

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

制作色谱图-第2部分

已经有一段时间了,不过继续4月27日我开始解释我是如何制作这幅图的,它来自Dipum3e.使用MATLAB的数字图像处理第三。):

在今天的后续后,我将讨论如何计算光谱的颜色以在X轴下显示。我将使用并指的是几个Dipum3e.功能。这些都可以在MATLAB颜色的工具文件交换和上GitHub.整个集合Dipum3e.功能也在上GitHub

内容

可见波长

x轴在图上的极限是什么?换句话说,我们感兴趣的可见波长是多少?您将看到在不同的地方使用不同的限制。这里使用的极限,380到780纳米,是Berns, R. S.(2000)给出的。Billmeyer和Saltzman的颜色技术校长John Wiley & Sons, NJ,第三版。

λ= 380:780;

找出光谱颜色的XYZ值

计算的第一步是找到每个值的XYZ值。这个计算可以在Dipum3e.函数lambda2xyz.但它真的很简单:只是插入CIE XYZ颜色匹配功能,由此返回Dipum3e.函数ColorMatchingFunction.

T = colorMatchingFunctions;头(T)
Ans = 8×4 table lambda x y z ______ __________ __________ __________ 360 0.0001299 3.917e-06 0.0006061 361 0.00014585 3.3936e -06 0.00014588 3.3936e -06 0.00014588 3.3936e -06 0.00014599 3.917e-06 0.00014588 3.3936e -06 0.000145880.0013727

找到特定Lambda的XYZ值,例如500,我们可以使用interp1.

interp1 (T.lambda [T.x、T.y T.z], 500)
ans = 0.0049 0.3230 0.2720

或者我们可以找到所有感兴趣波长的XYZ值。

XYZ = Interp1(T.Lambda,[T.X,T.Y,T.Z],Lambda(:));
情节(λ(:),XYZ)标题(“光谱波长的XYZ值”) 传奇(“X”“y”“z”

尝试简单的XYZ到RGB转换

让我们尝试使用图像处理工具箱功能简单地将这些XYZ值直接转换为RGBxyz2rgb

RGB = XYZ2RGB(XYZ);TrawColorbar(RGB)

(函数牵引彩色如下。它使用Dipum3e.函数colorSwatches.)

这对我来说看起来并不是一个非常好的光谱颜色。它似乎不均匀,几个似乎大多是一种颜色。这是怎么回事?如果我们绘制RGB值的线绘图,我们可以看到问题。(这Plotrgb.Shadegamutegion.函数在下面。)

关闭plotrgb shadeGamutRegion(λ(:),RGB)

灰色阴影区域显示0到1之间的范围;这是可显示的颜色范围。在该范围之外的所有内容(负值或大于1的值)无法完全显示。这些超出范围的值被剪切到可显示范围,并导致结果不佳。

我将向您展示该方法使用的方法Dipum3e.函数spectrumColors.该方法是Andrew Young(2012)中描述的方法的变体。呈现光谱https://taty.sdsu.edu/explain/optics/rendering.html.)。检索到2020年7月16日。

使用线性RGB值

首先,让我们将XYZ值转换为“线性”RGB值。我们看到的图像像素的典型RGB值是非线性地与光强度相关的,并且线性RGB值更适合于以下平均和缩放步骤。图像处理工具箱功能xyz2rgb可以可选地转换为线性值。

RGB_LIN = XYZ2RGB(XYZ,'色彩空间'“linear-rgb”);Plotrgb(lambda(:),rgb_lin)标题(光谱波长的线性RGB值

线性RGB值的启发式缩放

我们希望修改这些曲线,使它们落在范围内,并产生合理准确,平稳地变化和吸引光谱颜色的表示。

接下来我们要做的是缩放,使最大的线性RGB值是1.0。(注:Young(2012)除以固定值2.34。)

RGB_lin = RGB_lin / max(RGB_lin(:));plotrgb(λ(:),RGB_lin)

现在,一次一个组件,以及每个频谱颜色,用相同的y以足够的量中性灰色混合,使负组分值高达0。

Y = XYZ (:, 2);C = RGB_lin(:,k);F = y ./ (y - c);对于已有的组件值,百分比不需要缩放%非负面。f(c> = 0)= 1;RGB_LIN = Y + F. *(RGB_LIN  -  Y);结束plotrgb(λ(:),RGB_lin)

接下来,为了获得更明亮的光谱颜色,包括良好的黄色,缩放线性RGB值,允许它们高于1.0。然后,对于每种颜色,必要时缩放所有组件,使最大组件值为1.0。注意:[杨2012]使用1.85的比例因子。

RGB_LIN = RGB_LIN * 2.5;s = max(rgb_lin,[],2);s = max(s,1);rgb_lin = rgb_lin ./ s;plotrgb(λ(:),RGB_lin)

光滑的曲线

平滑线性RGB曲线以消除不连续的第一衍生物。这有助于频谱看起来更平滑,减少急剧的过渡点。注意:此步骤不在[杨2012]中。

RGB_LIN = CONV2(RGB_LIN,ONE(21,1)/ 21,“相同”);plotrgb(λ(:),RGB_lin)

通过浮点循环消除略大于1的小负数和数字略高于1。

rgb_lin = min(max(rgb_lin,0),1);

转换为最终结果的非线性RGB值

转换成适合在计算机显示器上显示的非线性sRGB值。

RGB = lin2rgb (RGB_lin);plotrgb(λ(:),RGB)
TrawColorbar(RGB)

下次,我会讨论如何在绘图下绘制光谱色谱。

效用函数

函数TraxColorbar(RGB_Colors)F =图;F.Position(4)= F.Position(4)/ 5;Colorswatches(RGB_Colors,0)DASPECT([40 1 1])轴结束函数Plotrgb(x,rgb_colors)%选择我们想使用的颜色从正常的线颜色顺序。C =线(7);blue = c(1,:);red = c(2,:);绿色= C(5,:);clf plot(x,rgb_colors(:,1),'颜色'、红);持有plot(x,rgb_colors(:,2),'颜色',绿色);plot(x,rgb_colors(:,3),'颜色',蓝色)网格紧的yl = ylim;ylim([min(yl(1)-0.05,-0.05)max(yl(2)+0.05,1.05)])传奇(“R”“G”“b”)包含(“波长(nm)”结束函数shadegamuregion xl = xlim;Xx = [xl(1) xl(2) xl(2) xl(1) xl(1)];Yy = [0 0 1 1 0];P = patch(xx,yy,[0.5 0.5 0.5],“FaceAlpha”, 0.1,......“EdgeAlpha”, 0.1,“HandleVisibility”“关闭”);结束




发布与MATLAB®R2020A

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。