**简短版本:**是否有Python方法显示图像,真实的显示像素索引和强度?所以当我在图像上移动光标时,我有一个不断更新的显示,如pixel[103,214] = 198
(用于灰度)或pixel[103,214] = (138,24,211)
(用于rgb)?
长版本:
假设我打开一个保存为ndarray im
的灰度图像,并从matplotlib中使用imshow
显示它:
im = plt.imread('image.png')
plt.imshow(im,cm.gray)
我得到的是图像,在窗口框架的右下角,是像素索引的交互式显示。除了它们不完全一样,因为它们的值不是整数:例如x=134.64 y=129.169
。
如果我将显示器设置为正确的分辨率:
plt.axis('equal')
x和y值仍然不是整数。spectral
包中的imshow
方法做得更好:
import spectral as spc
spc.imshow(im)
然后在右下角,我现在有pixel=[103,152]
。
然而,这些方法中没有一个也显示像素值。所以我有两个问题
matplotlib
中的imshow
(以及scikit-image
中的imshow
)是否可以强制显示正确的(整数)像素索引?
1.这些方法中的任何一个都可以扩展到显示像素值吗?
7条答案
按热度按时间ddarikpa1#
有几种不同的方法可以解决这个问题。
你可以用monkey-patch
ax.format_coord
,类似于this official example。我将在这里使用一种稍微更“pythonic”的方法,它不依赖于全局变量。(注意,我假设没有指定extent
kwarg,类似于matplotlib示例。要完全概括,你需要做更多的工作。)或者,为了插入我自己的一个项目,可以使用
mpldatacursor
。如果指定hover=True
,则每当您将鼠标悬停在启用的艺术家上方时,该框将弹出。(默认情况下,它只在点击时弹出。)注意mpldatacursor
确实正确地处理extent
和origin
kwargs到imshow
。另外,我忘了提到如何显示像素索引。在第一个例子中,它只是假设
i, j = int(y), int(x)
。如果您愿意,可以添加它们来代替x
和y
。使用
mpldatacursor
,您可以使用自定义格式化程序指定它们。i
和j
参数是正确的像素索引,无论绘制的图像的extent
和origin
如何。例如(注意图像的
extent
与显示i,j
坐标):3pmvbmvn2#
一个绝对简单的“一行程序”来做到这一点:(不依赖
datacursor
)它会关闭图像,以便确保如果你有多个图像,每个图像都将显示自己的值。
mtb9vblg3#
我看到的所有例子都只在x和y范围从0开始时才有效。下面是使用图像范围查找z值的代码。
如果您使用的是PySide/PyQT,这里有一个示例,可以显示数据的鼠标悬停工具提示
5ktev3wc4#
在Jupyter中,你可以使用
datacursor(myax)
或ax.format_coord
来实现。样本代码:
datacursor(myax)
也可以用ax.format_coord = lambda x,y : "x=%g y=%g" % (x, y)
代替2vuwiymt5#
如果你像我一样,在Google Colab上工作,这个解决方案不起作用,因为Colab禁用了matplotlib的图像交互功能。然后你可以简单地使用Plotly:https://plotly.com/python/imshow/
kpbwa7wx6#
Matplotlib具有内置的交互式绘图,它记录屏幕角落的像素值。
要安装,首先安装
pip install ipympl
然后使用
%matplotlib notebook
或%matplotlib widget
而不是%matplotlib inline
plotly
或Bokeh
的缺点是它们不能在Pycharm上工作。有关详细信息,请查看doc
50pmv0ei7#
要获取图像的交互式像素信息,使用模块imagetToolbox下载模块打开命令提示符并写入
pip install imagetoolbox编写给定的代码以获取图像的交互式像素信息enter image description here输出:enter image description here