图像中NaNs的对比色

时间:2011-12-12 21:45:37

标签: matlab

我使用NaN在矩阵中填充未使用的元素,并且在使用imagesc显示数据时,我想为具有NaN值的元素指定对比色。

以下是可能解决方案的链接,但我不太明白。

http://www.mathworks.com/matlabcentral/newsreader/view_thread/19985

3 个答案:

答案 0 :(得分:16)

NaN值从轴色彩图获得第一种颜色,默认情况下对应于最小值(NaN除外)。您可以使用CAXIS功能更改最小值设置轴颜色限制的颜色。要为NaN值指定对比色,您可以为NaN值添加一种特殊颜色作为第一种颜色(1x3向量)。

我拿你的例子做了一个函数(带了一些注释):

function [h hcb] = imagescwithnan(a,cm,nanclr)
% IMAGESC with NaNs assigning a specific color to NaNs

%# find minimum and maximum
amin=min(a(:));
amax=max(a(:));
%# size of colormap
n = size(cm,1);
%# color step
dmap=(amax-amin)/n;

%# standard imagesc
him = imagesc(a);
%# add nan color to colormap
colormap([nanclr; cm]);
%# changing color limits
caxis([amin-dmap amax]);
%# place a colorbar
hcb = colorbar;
%# change Y limit for colorbar to avoid showing NaN color
ylim(hcb,[amin amax])

if nargout > 0
    h = him;
end

此处caxis语句将颜色映射的第一种颜色分配给最小值amin,但分配给amin-dmap。所以第一种颜色专门分配给NaNs。


尝试使用以下功能:

a=peaks;
a(a < 0.5) = nan;
imagescwithnan(a,hot,[0 1 1]) %# [0 1 1] is cyan

test image - NaN color is hidden

如果你在函数中注释ylim语句(可以使用附加参数进行控制),这个NaN颜色将在colormap上。

test image - NaN color is shown on the colorbar

答案 1 :(得分:2)

使用多个颜色贴图有两个常规步骤:

  1. 将旧色图与旧色码叠加。
  2. 将要映射的新值移动到此新颜色映射,以使范围(新数据)与范围(旧数据)的比率与nrow(新颜色映射)与nrow(旧颜色映射)相同。
  3. 这将成功将新数据映射到新的色彩映射,同时将旧数据映射到旧色彩映射(即不改变旧数据的颜色)。另请注意,数据的副本会以存储图像,因此我们可以在不改变原始值的情况下进行此移位。

    简化示例:

    % Make image data
    img = -5:5;
    
    % Plot with original colormap
    figure
    imagesc(img);
    colormap(hot(8))
    
    % Add in an NaN
    img(3) = NaN;
    
    % Make new colormap
    n = 8;
    cols = [0 0 1 %blue
            hot(n)];
    
    % Plot with new colormap
    figure
    h = imagesc(img);
    colormap([0 0 1; hot(8)])
    
    % Scale data so that the range proportions match the colormap sizes
    cdata = get(h, 'CData');
    img_range = range(cdata(:));
    cdata(isnan(cdata)) = min(cdata(:)) - img_range/n;
    set(h, 'CData', cdata);
    

    enter image description here

    enter image description here

答案 2 :(得分:1)

这个问题首先出现在我的搜索引擎中,但我在this帖子中找到了一个更优选的答案,所以我想我会把它包含在这里。

总之,请使用以下内容:

imagesc(Z,'AlphaData',~isnan(Z))

或者,请注意pcolor默认忽略nan