2013-02-18 91 views
3

當使用imagesc可視化包含NaN值的數據時,Matlab將它們視爲最小值(灰色表示它們將它們塗成黑色,噴射藍色等)。噴氣機顏色圖不包含黑色和白色。是否可以將nan值顯示爲黑色/白色? 例如:Matlab imagesc plotting nan values

data = [0 0 0 ; .5 .5 .5 ;1 1 1;nan nan nan]; 

應該產生藍綠色 - 紅 - 黑條。

感謝

回答

8

我寫了一個自定義功能透視,即具有0

function h = imagesc2 (img_data) 
% a wrapper for imagesc, with some formatting going on for nans 

% plotting data. Removing and scaling axes (this is for image plotting) 
h = imagesc(img_data); 
axis image off 

% setting alpha values 
if ndims(img_data) == 2 
    set(h, 'AlphaData', ~isnan(img_data)) 
elseif ndims(img_data) == 3 
    set(h, 'AlphaData', ~isnan(img_data(:, :, 1))) 
end 

if nargout < 1 
    clear h 
end 

NaN秒的α值來顯示NaN值將因此被顯示的顏色爲同一圖背景顏色。如果刪除線axis image off,則NaN將顯示與軸背景顏色相同的顏色。該功能假定輸入圖像的大小爲n x m(單通道)或n x m x 3(三通道),因此可能需要根據您的使用情況進行一些修改。

與您的數據:

data = [0 0 0 ; .5 .5 .5 ;1 1 1;nan nan nan]; 
imagesc2(data); 
axis on 
set(gca, 'Color', [0, 0, 0]) 

enter image description here

0

我可以看到實現這一目標的兩種可能的方式:

一)修改噴氣顏色表,以便其最小值爲黑色或白色,如:

cmap = jet; 
cmap = [ 0 0 0 ; cmap ]; % Add black as the first color 

缺點如果使用此顏色圖顯示沒有nan值的數據,最小值也會以黑白顯示。

b)使用來自文件交換的sc,該文件將imagesc繪製爲RGB圖像。這更加靈活,因爲一旦擁有RGB圖像,您可以隨意操作它,包括更改所有nan值。例如:

im = sc(myData); 
im(repmat(isnan(myData), [ 1 1 3 ])) = 0; % Set all the nan values in all three 
              % color channels to zero (i.e. black) 
+0

第一個解決方案是沒有好處,因爲我們又回到了原點:楠和最小值是相同的顏色。 第二種解決方案更改圖像,添加數據光標時,顯示的數據是RGB值而不是實際值。 – Mercury 2013-02-18 09:51:12

1
function imagescnan(IM) 
% function imagescnan(IM) 
% -- to display NaNs in imagesc as white/black 

% white 
nanjet = [ 1,1,1; jet ]; 
nanjetLen = length(nanjet); 
pctDataSlotStart = 2/nanjetLen; 
pctDataSlotEnd = 1; 
pctCmRange = pctDataSlotEnd - pctDataSlotStart; 

dmin = nanmin(IM(:)); 
dmax = nanmax(IM(:)); 
dRange = dmax - dmin; % data range, excluding NaN 

cLimRange = dRange/pctCmRange; 
cmin = dmin - (pctDataSlotStart * cLimRange); 
cmax = dmax; 
imagesc(IM); 
set(gcf,'colormap',nanjet); 
caxis([cmin cmax]);