【问题标题】:Contourf and NaNs (how to make white regions transparent)Contourf 和 NaNs(如何使白色区域透明)
【发布时间】:2013-03-16 21:03:36
【问题描述】:

我正在尝试制作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;

输出:

提示:

在上面的代码后面加上:

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

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

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

如您所见,它并没有覆盖整个图像。如果我使用imdilate,它会去除白色区域,但同时也会破坏黑色边框以及一点点数据。

【问题讨论】:

  • 你能给出一个重现这个错误的示例代码吗?
  • 如果您查看代码 (edit contourf) 并搜索 isnan,您就会明白为什么会发生这种情况 - 在内部,该函数将 nans 转换为一个特殊值,然后使用它像所有其他人一样绘制一个补丁。由于补丁是堆叠的,因此在该补丁上设置透明度只会让您得到它下面的那个,而不是一直到背景图像。您最好的选择可能是适当地裁剪/遮盖背景图像,然后将其重新显示在 countourf 图上方。
  • @tmpearce 是的,我试过了。它存在一些问题,无法完美对齐。我将把我得到的问题附加到问题中。如果我可以直接在白色patch上设置图像,那就太好了。
  • 我想我可以通过首先将 NaN 转换为一个非常高的数字,进行绘图,然后删除相关补丁来使其工作 - 如果这不起作用,请尝试与将 NaN 转换为非常低的数字相反。您会想象 NaN 补丁会以一种或另一种方式出现在堆栈的底部 - 您只需要安排数据以确保这一点。但是...快速尝试一下,看起来堆栈中 NaN 补丁的位置可能取决于数据中 NaN 的位置。但这种方法可能值得研究?
  • 尝试使用文件交换中的patchTexture 将您的纹理(图像)映射到白色补丁上(因为您已经识别了它)。

标签: image matlab


【解决方案1】:

是否可以选择使用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;

【讨论】:

  • 这很有趣 - 我不知道 NaN 情节的 NaN 功能所以感谢您的回复。但是,如果可能的话,我想保留轮廓,因为它们可以更容易地看到颜色渐变。
  • 您可以在pcolor 之后添加contour(X,Y,Z, 'color', 'k'); 以获取轮廓。这些也不是为 NaN 绘制的,但在靠近 NaN 的边缘似乎并不完全准确。也许您可以通过使用更细粒度的矩阵来减少这些不准确性。
  • 我的意思是轮廓之间的contourf中显示的平面颜色。
【解决方案2】:

基于 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 倍才能获得相当平滑的图像。

【讨论】:

  • 我一直在沿着同一条路线进行试验。可能您更喜欢contourc 之类的函数来创建轮廓而不是使用圆形,因为contourc 负责处理闭合和平滑的补丁。但是,contourc 只返回分隔补丁的行,而不是补丁本身。
  • 是的,尽管pcolor 似乎甚至不值得使用。最好将这些值合并,然后将imshow 直接与颜色图和 alphamap 一起使用。感谢您的意见。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多