找到最小和最大像素的值

17

我计算了灰度图像中每个像素的最小和最大像素值,如下所示:

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

但这只适用于灰度图像。

我该如何在彩色图像(RGB)上实现相同的效果?


1
没问题,使用 numpy.min 和 numpy.max。 - double_g
最小值 = numpy.min(img) 最大值 = numpy.max(img) 像这样?我如何在RGB模式下使用它在图像上? - Mumfordwiz
确实,它只返回一个值,我正在寻找解决方案。 - double_g
6个回答

21

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

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

这给了我一个错误 回溯(最近的调用最后):   文件“<pyshell#25>”,第1行,<module>     minred = im [...,0] .min() TypeError:“JpegImageFile”对象不可订阅 - Mumfordwiz
1
@Mumfordwiz - 你需要将你正在使用的任何东西转换成numpy数组。显然这是一个JpegImageFile(不确定是哪个库)。如果JpegImageFile类支持它,你可能只需要做data = np.array(image) - Joe Kington
@Mumfordwiz 对的,所以你正在使用 PIL / Pillow 读取图像。正如 Joe Kington 所说,你可以使用 np.array(image) 将其转换为 Numpy 数组。 - YXD
非常感谢你! - Mumfordwiz

3
你可以在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
@Mumfordwiz - 你所说的“获取每个值”是什么意思?你只是想要 red, green, blue = result 吗?此外,使用哪个轴(axis=0 参数)取决于数组的排序方式。 - Joe Kington
我正在尝试获取每种颜色的最大和最小值,但似乎不知道如何使用它。 - Mumfordwiz
1
@Mumfordwiz - 返回的数组是最大红色值、最大绿色值和最大蓝色值。(尽管根据你使用的库等因素,这些带子可能会以不同的顺序出现。) 要获取最小值,只需使用 min(axis=0) 而不是 max - Joe Kington

3
smallest = image.min(axis=(0, 1))

largest = image.max(axis=(0, 1))

在我看来,最清晰的语法是。

这里最流行的建议都很糟糕。


2
假设您有一张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)

0
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)

添加一些解释会使这个答案更有用。 - Sagar Zala
这是stackoverflow评论答案的一部分。虽然代码已经很清楚了,但还是需要添加一些解释。 - Harsha Biyani

0
如果您想要将结果作为数组返回,这是一个简单的解决方案:
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()即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接