python-3.x 在Matplotlib中将RGB分离为三个颜色通道r、g和b并输出红色像素

bogh5gae  于 2022-12-14  发布在  Python
关注(0)|答案(1)|浏览(339)

基本上,我有一个图像,我需要找到红色像素,并输出一个红色像素的图像,但在黑色背景上是白色的。我必须使用maplotlib,所以我首先使用plt.imread读取我的图像,并将其转换为一个numpy数组。主要问题是我不知道如何访问数组的第三维,RGB值本身所在的位置,并将它们赋给一个变量。
我的形象是这样的:image
我的输出应该是:output image
到目前为止,我已经编写了这个代码,但是我不知道我做错了什么。上限和下限阈值应该检测像素,所以如果“red”高于上限阈值,红色像素将被检测到。
我的嵌套for循环应该获取rgb_image的宽度和长度,并从中找到像素,但我很确定我没有正确使用它们。
任何帮助将不胜感激!

import numpy as np
import matplotlib.pyplot as plt

def find_red_pixels(map_filename,upper_threshold=100,lower_threshold=50):
    rgb_image = plt.imread(map_filename)

    for x in range(0,rgb_image[1]):
        for y in range(0,rgb_image[0]):
            rgb_image = rgb_image * 255
            red = rgb_image[...,0]
            green = rgb_image[...,1] = 0
            blue = rgb_image[...,2] = 0
            if (red > upper_threshold).any() and (green < lower_threshold).any() and (blue < lower_threshold).any():
                plt.imshow(red)
                plt.show()
                         
print(find_red_pixels('./data/map.png'))
gcuhipw9

gcuhipw91#

问题是这样的:

red = rgb_image[...,0]
        green = rgb_image[...,1] = 0
        blue = rgb_image[...,2] = 0

是一个有效的python语法,因为有一个叫做“省略号”的东西,但它不是从np.array中提取颜色,而是产生

[Ellipsis, 0]
0
0

要区分使用numpy和索引,请使用:

red, green, blue = rgb_image[:, :, 0], rgb_image[:, :, 1], rgb_image[:, :, 2] # For RGB image

或者使用openCV(但请记住,默认情况下openCV图像是BGR,而不是RGB):

red, green, blue = cv2.split(rgb_image) # For RGB image

相关问题