如何使用Matplotlib获取像素的RGB值?

4
我需要找到图像中的所有红色像素,并创建只包含红色像素的图像。目前,我一直在研究matplotlib,因为我对它非常陌生。
def find_red_pixels(map, upper_threshold=100, lower_threshold =50):
    """Finds all red pixels of the "map" image and outputs a binary image file "map-red-pixels.jpg" """
    red_map = []
    for row in map:
        for pixel in row:
            print(pixel)

我是图片处理方面的新手,尝试了这个方法,但我不理解输出为像素的值[0.0.01]等代表什么意思。有没有更简单的方法?

1个回答

4
首先要理解的是当图像被读入时,它在数组中的表示方式。在这里,我读入了一张320x160的彩虹图片:

enter image description here

>>> img = plt.imread('rainbow.png')
>>> img.shape
    (160, 320, 4)

这显示了数组的维度 - 请注意元组的最后一个元素是4。这些值代表红色像素值、绿色像素值、蓝色像素值和透明度或 alpha 值。

我们想要找到具有特定红色值的像素,因此我们只对第一个感兴趣。让我们将它们拆分出来,以便我们可以直接处理它们:

>>> r = img[:,:,0]

这个过程隔离了与像素红度相关的数组部分,该值介于01之间。我们现在想要隔离出具有特定红度值的像素位置。我们可以使用 np.where 实现此目的,查找我们的新数组r中值大于0.5的元素(此值可以根据您对upper_thresholdlower_threshold的要求进行更改),并将其替换为1,否则将替换为0;从而创建一个二进制图像。

>>> binary_img = np.where(r > 0.5, 1, 0)

最后,我们只需要使用plt.imsave保存这个图像:
>>> plt.imsave('rainbow_red.png', binary_img , cmap='gray')

给出以下结果:

enter image description here


我认为你实际上捕捉到了红色、橙色和黄色的像素。 - Mark Setchell
1
@MarkSetchell 我认为这是 OP 问题中 upper_threshold=100, lower_threshold=50 参数的意图;以捕获所有红色值大于0.5的像素。 - CDJB
如果OP正在寻找红色像素,那么我的回答就是正确的。如果结果不能令OP满意,他可能会提出疑问。不过无论如何,我还是支持你的观点。 - Mark Setchell

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