Python中图像的交互式像素信息?
image
image-processing
python
7
0

简短版本:是否有Python方法显示图像,该图像实时显示像素索引和强度?这样,当我在图像上移动光标时,我会得到不断更新的显示,例如pixel[103,214] = 198 (对于灰度)或pixel[103,214] = (138,24,211)

长版:

假设我打开保存为ndarray灰度图像im ,并显示它imshow从matplotlib:

im = plt.imread('image.png')
plt.imshow(im,cm.gray)

我得到的是图像,并且在窗口框架的右下角,是像素索引的交互式显示。 x=134.64 y=129.169在于它们不是整数,因为它们的值不是整数:例如x=134.64 y=129.169

如果我将显示设置为正确的分辨率:

plt.axis('equal')

x和y值仍不是整数。

spectral包中的imshow方法做得更好:

import spectral as spc
spc.imshow(im)

然后在右下角,例如,我现在有pixel=[103,152]

但是,这些方法均未显示像素值。所以我有两个问题:

  1. matplotlibimshow (和scikit-imageimshow )是否可以强制显示正确的(整数)像素索引?
  2. 这些方法中的任何一种都可以扩展以显示像素值吗?
参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

有两种不同的方法可以解决此问题。

您可以猴子ax.format_coord补丁,类似于此官方示例 。在这里,我将使用一种不依赖全局变量的“ pythonic”方法。 (请注意,我假设未指定extent kwarg,类似于matplotlib示例。要完全通用,您需要做更多的工作 。)

import numpy as np
import matplotlib.pyplot as plt

class Formatter(object):
    def __init__(self, im):
        self.im = im
    def __call__(self, x, y):
        z = self.im.get_array()[int(y), int(x)]
        return 'x={:.01f}, y={:.01f}, z={:.01f}'.format(x, y, z)

data = np.random.random((10,10))

fig, ax = plt.subplots()
im = ax.imshow(data, interpolation='none')
ax.format_coord = Formatter(im)
plt.show()

在此处输入图片说明

另外,只需插入我自己的项目之一,就可以使用mpldatacursor 。如果指定hover=True ,则将鼠标悬停在已启用的艺术家上时,该框将弹出。 (默认情况下,仅在单击时才会弹出。)请注意, mpldatacursor确实会处理extentorigin imshow正确显示。

import numpy as np
import matplotlib.pyplot as plt
import mpldatacursor

data = np.random.random((10,10))

fig, ax = plt.subplots()
ax.imshow(data, interpolation='none')

mpldatacursor.datacursor(hover=True, bbox=dict(alpha=1, fc='w'))
plt.show()

在此处输入图片说明

另外,我忘了提到如何显示像素索引。在第一个示例中,仅假设i, j = int(y), int(x) 。如果愿意,可以添加那些代替xy

使用mpldatacursor ,您可以使用自定义格式化程序指定它们。 ij参数是正确的像素索引,而不管所绘制图像的extentorigin如何。

例如(注意图像的extent与显示的i,j坐标):

import numpy as np
import matplotlib.pyplot as plt
import mpldatacursor

data = np.random.random((10,10))

fig, ax = plt.subplots()
ax.imshow(data, interpolation='none', extent=[0, 1.5*np.pi, 0, np.pi])

mpldatacursor.datacursor(hover=True, bbox=dict(alpha=1, fc='w'),
                         formatter='i, j = {i}, {j}\nz = {z:.02g}'.format)
plt.show()

在此处输入图片说明

收藏
评论

要做到这一点的绝对准系统:(不依赖datacursor

def val_shower(im):
    return lambda x,y: '%dx%d = %d' % (x,y,im[int(y+.5),int(x+.5)])

plt.imshow(image)
plt.gca().format_coord = val_shower(ims)

它使图像处于关闭状态,因此请确保如果您有多个图像,则每个图像都将显示其自己的值。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题