努比np.任何范围或阈值

2021-09-27 05:59:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用python、OpenCV和Numpy。我的目标是找到所有的白色像素,把它变成红色,把所有其他关闭或白色。我的代码:

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

    # Read mask
    image = cv2.imread("path to my image")

    any_white = np.any(image == [255,255,255], axis = -1)

    image[any_white]=[255,0,0]
    plt.imshow(image)
    plt.show()

cv2.imwrite('result.png',image)

问题1:以任何[255,255,255]为目标并不能找到全部,怀特主义者,我开始寻找任何[244,244,244][243,243,243]等等。有没有办法设置白色的范围,可能是从[255,255,255][230,230,230]?你知道吗

enter image description here

问题2:很明显,在python中使用plt.imshow(image)plt.show(),结果显示为红色,但是当我使用cv2.imwrite('result.png',image)保存时,结果显示为蓝色。请参见结果图像。你知道吗

2条回答
网友
1楼 ·

问题1: 您计划瞄准的像素可能没有(255, 255, 255)的精确值。因此,最好通过设置像素值的范围来对图像进行二值化。通过创建轨迹栏并手动调整它们,可以找到精确的范围。您可以在OpenCVhere中找到有关实现轨迹栏的更多信息。你知道吗

问题2: 这是因为OpenCV默认使用BGR(Blue, Green, Red)颜色空间。在保存之前,可以使用cv2.cvtColor(image, cv2.COLOR_BGR2RGB)将颜色空间更改为RGB(Red, Green, Blue)。你知道吗

网友
2楼 ·

问题1: 您可以创建一个掩码,并将红色通道设置为False,这样,如果您只想以白色像素为目标,就可以将值保持在255

mask_bg = (image == [255, 255, 255])
mask_bg[:, :, 0] = False  # set red channel mask to false (leave 255 value)

image[mask_bg] = 0  # set all white pixels to [255, 0, 0]

如果要查找某个范围内的所有值,可以使用cv2.inRange

mask = cv2.inRange(image, (230, 230, 230), (255, 255,255))

问题2: OpenCV使用BGR作为默认值而不是RGB,您可以使用以下命令将BGR转换为RGB:

new_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('BGR Image', new_image )

请记住,如果您用OpenCV打开一个图像,它将是BGR,所以在操作通道之前转换它。你知道吗

相关问题