【问题标题】:finding the value of the min and max pixel找到最小和最大像素的值
【发布时间】:2014-02-02 17:47:04
【问题描述】:

我计算了灰度图像中像素的最小和最大像素值如下:

smallest = numpy.amin(image)
biggest = numpy.amax(image)

但这仅适用于灰度。

如何对彩色图像 (RGB) 执行相同操作?

【问题讨论】:

  • 是的,它有效,使用 numpy.min 和 numpy.max
  • smallest = numpy.min(img) maximum = numpy.max(img) 像这样?如何在 RGB 模式的图像上使用它?
  • 确实只返回一个值,我正在寻找解决方案

标签: python arrays image numpy colors


【解决方案1】:

您可以使用切片访问每个通道,如下所示:

# red
image[..., 0].min()
image[..., 0].max()
# green
image[..., 1].min()
image[..., 1].max()
# blue
image[..., 2].min()
image[..., 2].max()

【讨论】:

  • 这给了我一个错误 Traceback (最近一次调用最后): File "", line 1, in minred = im[..., 0].min( ) TypeError: 'JpegImageFile' 对象不可下标
  • @Mumfordwiz - 你需要将你正在使用的任何东西转换成一个 numpy 数组。显然是JpegImageFile(不确定来自哪个库)。如果JpegImageFile 类支持它,你也许可以做data = np.array(image)
  • @Mumfordwiz 对,所以您正在使用 PIL / Pillow 读取图像。正如 Joe Kington 所说,您将能够使用 np.array(image) 转换为 Numpy 数组
  • 非常感谢!
【解决方案2】:

您可以在python脚本中快速测试它。

import numpy
img = numpy.zeros((10,10,3), dtype=numpy.int)  # Black RGB image (10x10)
img[5,2] = [255, 255, 255]
print img.reshape((img.shape[0]*img.shape[1], 3)).max(axis=0)

数组([255, 255, 255])

【讨论】:

  • 好的,这似乎可行,但我不明白如何使用它,并找到每种颜色的每个最小值和最大值
  • @Mumfordwiz - “获取每个值”是什么意思?你只想要red, green, blue = result吗?此外,使用哪个轴(axis=0 参数)将取决于数组的排序方式。
  • 我正在尝试获取每种颜色的最大值和最小值。而且我似乎不知道如何使用它
  • @Mumfordwiz - 返回的数组是最大红色值、最大绿色值和最大蓝色值。 (尽管根据您使用的库等,波段的顺序可能不同。)要获得最小值,只需使用 min(axis=0) 而不是 max
【解决方案3】:

假设你有一个 BGR 图像(使用 OpenCV 加载),我找到了一个简单的方法来做到这一点:

import numpy as np

max_channels = np.amax([np.amax(img[:,:,0]), np.amax(img[:,:,1]), np.amax(img[:,:,2])])

print(max_channels)

【讨论】:

    【解决方案4】:
    import numpy
    img = numpy.zeros((10,10,3), dtype=numpy.int)  
    img[5,2] = [255, 255, 255]
    print img.reshape((img.shape[0]*img.shape[1], 3)).max(axis=0)
    

    【讨论】:

    • 添加一些解释会使这个答案更有用。
    • 这是stackoverflow中评论答案的一部分。尽管代码是解释性的,但添加一些解释。
    【解决方案5】:

    如果您希望将结果作为数组,这是一个简单的解决方案:

    smallest = np.amin(image, axis=(0, 1))
    largest = np.amax(image, axis=(0, 1))
    

    但由于某种原因,这些更快:

    smallest = image.min(axis=0).min(axis=0)
    biggest = image.max(axis=0).max(axis=0)
    

    如果您希望将结果作为列表,只需将.tolist() 添加到上述每个末尾。

    【讨论】:

      【解决方案6】:
      smallest = image.min(axis=(0, 1))
      
      largest = image.max(axis=(0, 1))
      

      是语法上最简洁的imo。这里最受欢迎的建议很糟糕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-21
        • 2017-01-04
        • 2012-05-05
        相关资源
        最近更新 更多