Установите для всех цветных пикселей на изображении значение Bright [255] ?, OpenCV. - PullRequest
0 голосов
/ 02 октября 2019

Я делаю проект, который включает в себя цветные фотографии знаков вокруг территории кампуса. Мне нужно взять знак и обозначить номера на нем.

enter image description here

До сих пор я снимал изображение, преобразовывал его в оттенки серого, фильтровал/ точитьТогда порог, чтобы схватить знак. Это работает большую часть времени, потому что знак черный, а текст белый.

enter image description here

Однако есть некоторые изображения, в которых объединены темные тенипри ярком солнечном освещении некоторые участки фона внутри тени темнее черного знака.

enter image description here

Из-за этого не существует значения удержания порога, которое можетизолируйте знак от фона.

Итак, мой вопрос, есть ли способ предварительной обработки изображения, чтобы все цветные участки, даже очень темные (например, темно-коричневый / красный), были установлены на 255. И затем, основываясь на пороговом значении, установите все черные секции на 0, а белые на 255.

Я знаю, что у белых, черных и серых есть одинаковые значения bgr, так что, безусловно, должен быть способ сделать это.

Спасибо и извините за невозможность связать изображения напрямую. У меня недостаточно очков.

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы можете конвертировать изображение в HSV - Hue, Saturation, Value. Оттенок определяет цвет, насыщенность, интенсивность цвета и значение яркости. Значения черного / серого / белого имеют небольшую насыщенность, поэтому вы можете использовать это свойство для удаления фона.

Это визуализация HSV:
enter image description here Требуются все значенияв «ядре» цилиндра.

Результат:
enter image description here

Код:

    import cv2
    import numpy as np
    # load image
    img = cv2.imread("0hfSa20.png")
    # Convert to HSV
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    # define range wanted color in HSV
    lower_val = np.array([0,0,0]) #full black RGB = 0,0,0
    upper_val = np.array([179,58,255]) # all hue, all value, cap saturation at 58

    # Threshold the HSV image to get only grayish colors
    mask = cv2.inRange(hsv, lower_val, upper_val)

    # apply mask to image
    res = cv2.bitwise_and(img,img,mask=mask)

    # display image
    cv2.imshow("Res", res)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

HSV также оченьхорошо для фильтрации цвета. Если вы хотите поэкспериментировать со значениями и научиться понимать HSV, этот сценарий очень полезен.

0 голосов
/ 03 октября 2019

Мне нравится @JDs Answer. Очень умно.

В качестве альтернативного решения адаптивный гауссовский порог работает на меня (так же, как и обычный адаптивный порог). Но с неожиданным поворотом: я использовал отрицательную постоянную C:

import cv2

image = cv2.imread('311.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('311_thresh.png', image)

image = cv2.imread('109.png', 0)
image = cv2.adaptiveThreshold(image,255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                              cv2.THRESH_BINARY, 17, -6)
cv2.imwrite('109_thresh.png', image)

311_thresh.png:

enter image description here

109_thresh.png:

enter image description here

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