Ошибка отображения цвета при применении маски - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь отфильтровать изображение в OpenCV (с Python), но я получаю синюю область вместо черного после применения маски.

Вскоре код изменяетЦветовое пространство изображения от BGR до LAB, затем создает маску с функцией cv2.inRange и инвертирует ее с помощью cv2.bitwise_not.После этого маска применяется с функцией cv2.bitwise_and.Вот исходный и отфильтрованный кадр:

https://i.stack.imgur.com/6pGym.png

Сначала я подумал, что это может быть проблемой между изображением BGR / RGB, но синей областьюисключено, цвета изображения правильные.

Вот код:

# Parameter "frame": BGR image.
# Parameter "min": min LAB val.
# Parameter "max": max LAB val.
# Return filtered frame in BGR.
def applyFilter(frame, min, max):

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

    mask = cv2.inRange(frame, min, max)
    mask = cv2.bitwise_not(mask)

    filtered_frame = cv2.bitwise_and(frame, frame, mask=mask)

    return cv2.cvtColor(filtered_frame, cv2.COLOR_LAB2BGR)

1 Ответ

0 голосов
/ 11 июля 2019
Цветовое пространство

LAB имеет 3 канала, L от 0 до 100%, a от -128 до 128 и b от -128 до 128. Значения OpenCV в LAB для изображения uint8следующие:

enter image description here

Ваша проблема в том, что в OpenCV значение (0,0,0) в LAB в действительности (0, -128, -128), которое можно посмотреть вонлайн colorpicker и посмотрите, что это синий.

Когда вы применяете маску, то, что не в маске, остается "черным" (0,0,0) и после преобразования изLAB to BGR затем синий.Если идея состоит в том, чтобы оставить то, что не выделено черным, у вас есть 2 решения:

1) применить маску к исходному изображению

2) преобразовать 0,0,0 пикселей в 0,128,128

Для 1) код будет таким:

# Parameter "frame": BGR image.
# Parameter "min": min LAB val.
# Parameter "max": max LAB val.
# Return filtered frame in BGR.
def applyFilter(frame, min, max):

    tempFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB)

    mask = cv2.inRange(tempFrame, min, max)
    mask = cv2.bitwise_not(mask)

    filtered_frame = cv2.bitwise_and(frame, frame, mask=mask)

    return filtered_frame
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...