我有一个numpy数组,其中包含一些图像数据。我想绘制一个横切面的“轮廓”。最简单的情况是轮廓平行于图像的边缘,因此如果图像阵列是imdat
,则在选定点(r,c)
处的轮廓简单地是imdat[r]
(水平)或imdat[:,c]
(垂直)。
现在,我想取两个点(r1,c1)
和(r2,c2)
作为输入,它们都位于imdat
内部。我想沿着连接这两个点的线绘制值的轮廓。
从numpy数组中获取值的最佳方法是什么?更一般地,沿着路径/多边形?
我以前使用过切片和索引,但我似乎无法找到一个优雅的解决方案,因为连续的切片元素不在同一行或列中。谢谢你的帮助。
6条答案
按热度按时间drkbr07n1#
@Sven的答案是简单的方法,但对于大型数组来说效率相当低。如果你正在处理一个相对较小的数组,你不会注意到差异,如果你想要一个大的配置文件(例如:>50 MB),您可能想尝试其他几种方法。但是,您需要在“像素”坐标中工作,因此存在额外的复杂性。
还有两种更有效的内存方式。1)如果需要双线性或三次插值,则使用
scipy.ndimage.map_coordinates
。2)如果你只是想要最近邻采样,那么就直接使用索引。作为第一个例子:
字符串
x1c 0d1x的数据
使用最近邻插值的等效方法如下所示:
型
的
然而,如果你使用的是最近邻,你可能只想在每个像素上采样,所以你可能会做一些更像这样的事情,而不是...
型
的
tct7dpnv2#
我一直在用星系图像测试上面的例程,并认为我发现了一个小错误。我认为一个转置需要添加到乔提供的其他伟大的解决方案。下面是他的代码的一个稍微修改的版本,它揭示了这个错误。如果你运行它没有转置,你可以看到配置文件不匹配;转置的话看起来没问题。这在Joe的解决方案中并不明显,因为他使用了对称图像。
字符串
这是没有转置的版本。请注意,根据图像,只有左侧的一小部分应该是明亮的,但图显示几乎一半的图是明亮的。
x1c 0d1x的数据
这是一个带有转置的版本。在这张图中,图似乎与您对图中红线的期望很好地匹配。
的
polkgigr3#
最简单的方法是使用
scipy.interpolate.interp2d()
:字符串
i86rm4rw4#
要获得现成的解决方案,请查看
scikit-image
的measure.profile_line
函数。它构建在
scipy.ndimage.map_coordinates
之上,就像@Joe的answer一样,并具有一些额外的有用功能。xbp102n05#
将这个答案与Event Handling example on MPL's documentation结合起来,下面是允许基于GUI的拖动来绘制/更新切片的代码,通过拖动绘图数据(这是针对pcolormesh绘图编写的):
字符串
在pcolor图上拖动后,结果如下(添加轴标签等后):x1c 0d1x的数据
csga3l586#
下面是一个不使用scipy包的方法。它应该运行得更快,并且易于理解。基本上,点1(pt1)和点2(pt2)之间的任何一对坐标都可以转换为x和y像素整数,因此我们不需要任何插值。
字符串
的数据
使用的Picture1.png图:
查看更多详情:https://github.com/xuejianma/fastLinecut_radialLinecut
代码还有一个功能:取几个Angular 均匀间隔的线的平均值。
的