Contourf和NaNs(如何使白色区域透明)

时间:2013-03-26 21:26:53

标签: image matlab

我正在尝试制作contourf图,但数据数组的某些区域有NaN(仅在数据矩阵中,x和y网格网格矩阵已满)。我希望这些NaN是透明的,它们用于矩形边界上的NaN。但是,数据矩阵内的连续NaN区域是白色而不是透明的。以下是一个例子:

代码:

[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
contourf(X,Y,Z);
colormap jet;

输出:

enter image description here

提示:

使用以下代码附加上述代码:

% Find Face
set(findobj(h,'FaceColor',[1 1 1]),'FaceAlpha',0))

将找到白色补丁对象并将其设置为透明。不幸的是,下面的补丁已经满了:

enter image description here

更新:获取NaN区域并叠加背景图像结果:

enter image description here

正如你所看到的,它并没有覆盖整个图像。如果我使用imdilate它会消除白色区域,但同时也会破坏黑色边框以及一些数据。

2 个答案:

答案 0 :(得分:5)

基于H. Muster的回答,我通过分割数据人为地创建了乐队(您可以使用一个简单的函数来选择乐队,或者在虚拟人物上使用contour创建乐队,然后返回,并重复使用它们。)

[X Y] = meshgrid(10:0.1:50);
Z = X.*Y;
Z(100:300,100:300) = NaN;
figure
hold on;
h = pcolor(X,Y,round(Z/500)*500);
set(h,'Edgecolor',  'interp');
colormap jet;
set(gca, 'XLim', [0 60], 'YLim', [0 60]);

我担心我没有包含imread的工具箱,因此无法显示基础渐变,但我认为这样可行。我必须将分辨率提高10倍才能获得相当平滑的图像。

enter image description here

答案 1 :(得分:4)

使用pcolor代替contourf是否可以选择?

[X Y] = meshgrid(10:50);
Z = X.*Y;
Z(10:30,10:30) = NaN;
figure
imshow(uint8(repmat(1:4:240,[60,1,3])));
hold on;
h = pcolor(X,Y,Z)
set(h,'Edgecolor',  'interp');
colormap jet;

enter image description here