Потеря точности преобразования цветового пространства Python CV2 - PullRequest
0 голосов
/ 06 января 2019

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

enter image description here

Соблюдайте следующий код 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)

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

enter image description here

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

enter image description here

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

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

1 Ответ

0 голосов
/ 07 января 2019

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

#!/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-битное представление без знака, Hue получает "squished" из диапазона 0..360 в диапазоне 0..180, в 2 градусах увеличивается для того, чтобы оставаться в 8-битном диапазоне без знака 0..255, вызывая шаги между соседними значениями. Решение состоит в том, чтобы перейти к 32-разрядным числам с плавающей запятой и масштабировать до диапазона 0..1.

...