Попытка «вручную» преобразовать в hsv изображение bgr в opencv-python - PullRequest
0 голосов
/ 30 мая 2018

Используемый мной алгоритм:

def rgb2hsv(r, g, b):
    r, g, b = r/255.0, g/255.0, b/255.0
    mx = max(r, g, b)
    mn = min(r, g, b)
    df = mx-mn
    if mx == mn:
        h = 0
    elif mx == r:
        h = (60 * ((g-b)/df) + 360) % 360
    elif mx == g:
        h = (60 * ((b-r)/df) + 120) % 360
    elif mx == b:
        h = (60 * ((r-g)/df) + 240) % 360
    if mx == 0:
        s = 0
    else:
        s = df/mx
    v = mx
    return h, s, v



def my_bgr_to_hsv(bgr_image):
    height, width, c = bgr_image.shape

    hsv_image = np.zeros(shape = bgr_image.shape)

    #The R,G,B values are divided by 255 to change the range from 0..255 to 0..1:

    for h in range(height):
        for w in range(width):
            b,g,r = bgr_image[h,w]
            hsv_image[h,w] = rgb2hsv(r,g,b)      

    return hsv_image

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

Вот как я пытаюсь отобразить изображение:

cv.imshow("hello", cv.cvtColor(np.uint8(hsv_image), cv.COLOR_HSV2BGR))

Как вы видите, я конвертирую его обратно в bgr, чтобы использовать cv.imshow, так как он использует только bgr.

Я не думаю, что достаточно разбираюсь в opencv или numpy для его отладки.

Простое использование imshow показывает исходное изображение в неправильных цветах, что заставляет меня думать, что оно не может быть полностью неправильным.

1 Ответ

0 голосов
/ 31 мая 2018

Ваши значения оттенков масштабируются в диапазоне от 0 до 359, что не вписывается в 8-разрядное число без знака, а значения насыщенности и значения масштабируются в диапазоне от 0 до 1, что не соответствует вашим оттенкам для масштаба.и приведет к тому, что все будет округлено до нуля (черным), когда вы преобразуете его в 8-разрядное число без знака.

Я предлагаю вам умножить насыщенность и значение на 255 и разделить ваш оттенок на 2.

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