Потеря точности преобразования цветового пространства Python CV2

1

Обратите внимание на следующее изображение:

Изображение 174551

Соблюдайте следующий код Python:

import cv2
img = cv2.imread("rainbow.png", cv2.IMREAD_COLOR)
img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # convert it to hsv
img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR) # convert back to BGR
cv2.imwrite("out.png", img)

Вот выходное изображение:

Изображение 174551

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

Изображение 174551

Что здесь происходит? Есть ли способ предотвратить появление этих блочных артефактов? Мне нужно преобразовать в цветовое пространство HSL, чтобы повернуть оттенок, но я не могу этого сделать, если я собираюсь получить такие артефакты.

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

  • 2
    Может быть, это 8-битное изображение? Оттенок отображается от 360 градусов до 180 градусов, чтобы оставаться ниже 255 - предел 8-разрядного числа без знака. Таким образом, есть зернистость оттенка 2 степени.
  • 0
    @MarkSetchell, вы правы, это 8-битное изображение. Так что я могу сделать, чтобы избежать этого?
Показать ещё 1 комментарий
Теги:
opencv
image
colors
cv2

1 ответ

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

Вернитесь к компьютеру сейчас - попробуйте так:

#!/usr/bin/env python3
import numpy as np
import cv2

img = cv2.imread("rainbow.png", cv2.IMREAD_COLOR)
img = img.astype(np.float32)/255           # go to 32-bit float on 0..1

img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # convert it to hsv
img = cv2.cvtColor(img, cv2.COLOR_HSV2BGR) # convert back to BGR
cv2.imwrite("output.png", (img*255).astype(np.uint8))

Я думаю, что проблема заключается в том, что когда вы используете 8-битное представление без знака, оттенок "сплющивается" из диапазона 0..360 в диапазон 0..180 с шагом 2 градуса, чтобы оставаться в пределах 8-битного диапазон без знака 0..255, вызывающий шаги между соседними значениями. Решение состоит в том, чтобы перейти к 32-разрядным числам с плавающей запятой и масштабировать до диапазона 0..1.

Ещё вопросы

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