Преобразование RGB в HSI - оттенок всегда рассчитывается как 0

1

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

Я до сих пор сузил проблемы до двух возможных проблем:

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

Вот код:

import cv2
import numpy as np

def RGB_TO_HSI(img):

with np.errstate(divide='ignore', invalid='ignore'):

    bgr = cv2.split(img)

    intensity = np.divide(bgr[0] + bgr[1] + bgr[2], 3)
    saturation = 1 - 3 * np.divide(np.minimum(bgr[2], bgr[1], bgr[0]), bgr[2] + bgr[1] + bgr[0])

    def calc_hue(bgr):
        blue = bgr[0]
        green = bgr[1]
        sqrt_calc = np.sqrt(((bgr[2] - bgr[1]) * (bgr[2] - bgr[1])) + ((bgr[2] - bgr[0]) * (bgr[1] - bgr[0])))

        if green.any >= blue.any:
            hue = np.arccos(1/2 * ((bgr[2]-bgr[1]) + (bgr[2] - bgr[0])) / sqrt_calc)
        else:
            hue = 360 - np.arccos(1/2 * ((bgr[2]-bgr[1]) + (bgr[2] - bgr[0])) / sqrt_calc)

        hue = np.int8(hue)
        return hue

    hue = calc_hue(bgr)
    hsi = cv2.merge((intensity, saturation, calc_hue(bgr)))

Вот формула, которую я использовал для преобразования

Заранее благодарим за любые советы или идеи

  • 0
    Я нашел некоторые ошибки в расчете (или, по крайней мере, я думаю, что это были ошибки), и теперь оттенки выводит NaN вместо чисел.
  • 0
    Почему бы не использовать метод OpenCV для конвертации напрямую?
Показать ещё 5 комментариев
Теги:
opencv
numpy
image

1 ответ

0
Лучший ответ

Хорошо, здесь многое происходит. Я должен сказать это, я знаю, что вы новичок, но прежде чем отправлять вопрос, проверьте документы, иначе вы в конечном итоге воспользуетесь ошибками libs. (т.е. np.minimum() не сравнивает сразу 3 значения).

Обратите внимание на типы переменных. Ваш код выполняет операции с np.uint8 как если бы они np.int32. Всегда старайтесь поддерживать соответствие вашим типам переменных.

Достаточно сказать, не слишком сильно меняя свой код, вот что я придумал:

import cv2
import numpy as np
from math import pi

def BGR_TO_HSI(img):

  with np.errstate(divide='ignore', invalid='ignore'):

    bgr = np.int32(cv2.split(img))

    blue = bgr[0]
    green = bgr[1]
    red = bgr[2]

    intensity = np.divide(blue + green + red, 3)

    minimum = np.minimum(np.minimum(red, green), blue)
    saturation = 1 - 3 * np.divide(minimum, red + green + blue)

    sqrt_calc = np.sqrt(((red - green) * (red - green)) + ((red - blue) * (green - blue)))

    if (green >= blue).any():
      hue = np.arccos((1/2 * ((red-green) + (red - blue)) / sqrt_calc))
    else:
      hue = 2*pi - np.arccos((1/2 * ((red-green) + (red - blue)) / sqrt_calc))

    hue = hue*180/pi

    hsi = cv2.merge((hue, saturation, intensity))
    return hsi

Я надеюсь, что это помогло

  • 0
    Спасибо, это очень помогло! Я буду читать на документах немного больше в будущем
  • 0
    @SimonLaursen Я только что отредактировал ответ, чтобы исправить угол наклона, теперь он возвращает значение от 0 до 360 градусов

Ещё вопросы

Сообщество Overcoder
Наверх
Меню