Numpy np.any диапазон или порог - PullRequest
1 голос
/ 22 марта 2019

Я использую 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: ясно, с plt.imshow(image) и plt.show() внутри python, результат показывает красный цвет, но когда я использовал cv2.imwrite('result.png',image) для сохранения, он синий.Смотрите изображение результата.

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Проблема 1: Пиксели, на которые вы планируете ориентироваться, могут не иметь точного значения (255, 255, 255).Следовательно, лучше преобразовать изображение в двоичную форму, задав диапазон значений пикселей.Вы можете найти точный диапазон, создавая трекбары и настраивая их вручную.Вы можете найти больше информации о реализации трекбаров в OpenCV здесь .

Проблема 2: Это происходит потому, что OpenCV по умолчанию использует цветовое пространство BGR или (Blue, Green, Red).Вы можете изменить цветовое пространство на RGB или (Red, Green, Blue), используя cv2.cvtColor(image, cv2.COLOR_BGR2RGB) перед сохранением.

1 голос
/ 22 марта 2019

Проблема 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, поэтому преобразуйте его, прежде чем манипулировать каналами.

...