Цвет изображения выглядит нарушенным при преобразовании из BGR в HSV и обратно - PullRequest
1 голос
/ 11 декабря 2019

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

Моя структура:

  1. Преобразование BGR в HSV
  2. Преобразование изображения как (вращение, масштабирование, сдвиг, перевод)
  3. Преобразование HSV вBGR

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

Я сделал случайную выборку в пределах [-10, 10] для оттенка, в пределах [-80, 80] для насыщенности и в пределах [-40, 40] для значения. Кроме того, следуя этой ссылке , я установил свой код следующим образом.


class RandomHSV(object):
   def __init__(self, hue = None, saturation = None, brightness = None):
        if hue:
            self.hue = hue 
        else:
            self.hue = 0

        if saturation:
            self.saturation = saturation 
        else:
            self.saturation = 0

        if brightness:
            self.brightness = brightness
        else:
            self.brightness = 0



        if type(self.hue) != tuple:
            self.hue = (-self.hue, self.hue)

        if type(self.saturation) != tuple:
            self.saturation = (-self.saturation, self.saturation)

        if type(brightness) != tuple:
            self.brightness = (-self.brightness, self.brightness)

    def __call__(self, img, bboxes):

        hue = random.randint(*self.hue)
        saturation = random.randint(*self.saturation)
        brightness = random.randint(*self.brightness)

        img = img.astype(int)

        a = np.array([hue, saturation, brightness]).astype(int)
        img += np.reshape(a, (1,1,3))

        img = np.clip(img, 0, 255)
        img[:,:,0] = np.clip(img[:,:,0],0, 179)

        img = img.astype(np.uint8)



        return img, bboxes



enter image description here enter image description here

1 Ответ

1 голос
/ 11 декабря 2019

Похоже, что openCV RGB to HSV не имеет ожидаемых значений. Я взял ваше изображение и преобразовал его в HSV и посмотрел диапазоны каждого канала. Используя np.max(imageHSV[:,:,c]) и np.min(imageHSV[:,:,c]) на каждом канале, я увидел, что оттенок отображается в диапазоне от 0 до 360, а насыщенность и значение масштабируются от 0 до 1. Используя ваш метод обрезки на вашем изображении:

img = np.clip(img, 0, 255)
img[:,:,0] = np.clip(img[:,:,0],0, 179)

и затем, преобразовав обратно в RGB, я получил такой результат: bad HSV conversion

Я попытался вместо этого обрезать от 0 до 360 (оттенок) и от 0 до 1 (насыщенность изначение), как это:

imageHSV = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)

imageHSV[:,:,1] = np.clip(imageHSV[:,:,1], 0.0, 1.0)
imageHSV[:,:,2] = np.clip(imageHSV[:,:,2], 0.0, 1.0)
imageHSV[:,:,0] = np.clip(imageHSV[:,:,0],0.0, 360.0)

Затем я преобразовал обратно в RGB, и это был результат. good HSV conversion

edit - Выход HSV зависит от типа данных, которые вы вводите в преобразователь, см. эту документацию. У моего изображения были диапазоны (0-360, 0-1, 0-1) для (H, S и V) из-за того, как я передал его в cv2.cvtColor. Проверьте свои данные, которые вы передаете в функцию преобразования RGB2HSV, и проверьте выходные данные, чтобы увидеть, есть ли у вас диапазоны, которые вы хотите обрезать. Я все еще думаю, что это может быть тип данных или проблема с обрезкой данных.

...