史蒂夫在图像处理与matlab

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

进行色彩频谱图 - 第2部分

这是前一段时间了,但在4月27日我开始解释我是如何做到这情节,这是从Dipum3e.使用MATLAB的数字图像处理,第3版):

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

内容

可见波长

应该x轴的限制是对这个情节是什么?换句话说,什么是可见光波长,我们有兴趣?你会看到在不同的地方使用不同的限制。这里使用的限制,380nm至780nm时,是在那些给定的伯恩斯,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 4.3936e-06 0.00068088 362 0.0001638 4.9296e-06 0.00076515 363 0.000184 5.5321e-06 0.00086001 364 0.00020669 6.2082e-06 0.00096659 365 0.0002321 6.965e-06 0.001086 366 0.00026073 7.8132e-06 0.0012206 367 0.00029308 8.7673e-06 0.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)

(功能drawColorbar在下面。它使用了Dipum3e.功能colorSwatches。)

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

接近plotrgb(拉姆达(:),RGB)shadeGamutRegion

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

我将向您展示该方法使用的方法Dipum3e.功能spectrumColors。该方法是在所描述的一个的变体:安德鲁杨(2012)。渲染谱https://taty.sdsu.edu/explain/optics/rendering.html.)。检索到2020年7月16日。

线性RGB值工作

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

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

线性RGB值的启发式缩放

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

我们要做的下一件事是规模,使最大线性RGB值是1.0。(注:杨(2012)通过的2.34的固定值分歧。)

RGB_lin = RGB_lin / MAX(RGB_lin(:));Plotrgb(lambda(:),rgb_lin)

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

Y = XYZ(:,2);为了K = 1:3 C = RGB_lin(:,k​​)的;F =ÿ./(Y  -  C);对于已有的组件值,百分比不需要缩放%非负面。f(c> = 0)= 1;RGB_LIN = Y + F. *(RGB_LIN  -  Y);结尾Plotrgb(lambda(:),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(lambda(:),rgb_lin)

平滑曲线

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

RGB_LIN = CONV2(RGB_LIN,ONE(21,1)/ 21,'相同的');Plotrgb(lambda(:),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),'颜色',蓝色)保持离开网格紧的基= ylim;ylim([分钟(基(1)-0.05,-0.05)MAX(基(2)+0.05,1.05)])图例(“r”“G”“b”)xlabel(“波长(nm)”结尾功能shadeGamutRegion XL = XLIM;XX = [XL(1)XL(2)XL(2)XL(1)XL(1)];YY = [0 0 1 1 0];P =补丁(XX,YY,[0.5 0.5 0.5],“FaceAlpha”,0.1,......“EdgeAlpha”,0.1,“HandleVisibility”“离开”);结尾




发布与MATLAB®R2020A

|
  • 打印
  • 发电子邮件

コメント

コメントを残すには,ここをクリックしてMathWorks的アカウントにサインインするか新しいMathWorks的アカウントを作成します。