脾气暴躁的任何范围或阈值

时间:2019-03-22 07:04:55

标签: python numpy opencv rgb

我正在使用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 个答案:

答案 0 :(得分:1)

问题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,因此请在操作通道之前进行转换。

答案 1 :(得分:1)

问题1: 您计划定位的像素可能没有精确的(255, 255, 255)值。因此,最好通过设置像素值范围对图像进行二值化处理。您可以通过创建跟踪栏并手动对其进行调整来找到确切的范围。您可以找到有关在OpenCV here中实现跟踪栏的更多信息。

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