Случайное квантование в преобразовании BGR в HSV

Я пытаюсь преобразовать изображение BGR в HSV. Когда я записываю H-канал преобразования, он имеет странную блочную структуру, которая, как я предполагаю, означает, что что-то случайно квантовалось на этом пути. Я попытался сначала преобразовать свое изображение BGR unsigned char в float, но результат тот же. Вот мой код:

// STL
#include <iostream>

// OpenCV
#include <opencv2/opencv.hpp>

void Float(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat floatImage;
    image.convertTo(floatImage, CV_32FC3);

    cv::Mat hsvImage;
    cv::cvtColor(floatImage, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_float.png", hsvChannels[0]);

}

void Original(const std::string& inputFilename)
{
    cv::Mat image = cv::imread(inputFilename, CV_LOAD_IMAGE_COLOR); // Loads as BGR

    cv::Mat hsvImage;
    cv::cvtColor(image, hsvImage, CV_BGR2HSV);

    std::vector<cv::Mat> hsvChannels;
    cv::split(hsvImage, hsvChannels);

    cv::imwrite("h_original.png", hsvChannels[0]);

}

int main(int argc, char* argv[])
{
    std::string inputFilename = argv[1];

    Original(inputFilename);
    Float(inputFilename);

    return EXIT_SUCCESS;
}

и вот ввод:  введите описание изображения здесь

и вывод (h_original.png):  введите описание изображения здесь

и вывод (h_float.png):  введите описание изображения здесь

Есть какие-нибудь предложения относительно того, что я здесь делаю не так?


person David Doria    schedule 24.01.2016    source источник
comment
что не так с выводом? кажется мне логичным   -  person Humam Helfawi    schedule 24.01.2016
comment
@HumamHelfawi Это очень блочно. Изображение H (или S, или V) должно выглядеть как версия исходного изображения в оттенках серого, верно? То есть оно должно меняться так же плавно, как и исходное изображение. Почему появляются все эти прямоугольные артефакты / края?   -  person David Doria    schedule 24.01.2016
comment
Я не уверен, но ваше изображение, кажется, имеет очень низкое цветовое пространство (белый и его градусы)   -  person Humam Helfawi    schedule 24.01.2016
comment
@HumamHelfawi Это не должно повлиять на плавность. RGB - это непрерывное пространство, и HSV также является непрерывным пространством, поэтому отображение не следует квантовать таким образом.   -  person David Doria    schedule 24.01.2016
comment
Да, непрерывно, но только на N. Но дело, конечно, не в этом. Рассмотрим такой случай: изображение черной формы со светом и тенью на ней. вся фигура черная, поэтому она будет сопоставлена ​​с одинаковыми значениями H и S (почти). но V будет содержать очень гладкие и разные значения.   -  person Humam Helfawi    schedule 24.01.2016
comment
См. Мою правку в моем ответе, пожалуйста   -  person Humam Helfawi    schedule 24.01.2016


Ответы (1)


Вы все делаете правильно. Я попробовал ваше изображение на своей машине и получил те же результаты. Думаю, такой результат связан с низкой цветовой гаммой вашего изображения. Это результат 3 каналов HSV. H и S. страдают от этой проблемы. Тем не менее, V является гладким, потому что это связано с условиями освещения, а не с цветом.

H-канал

S-канал

V-канал

РЕДАКТИРОВАТЬ:

Чтобы прояснить мою мысль, просмотрите это изображение и результат с использованием того же кода:

Исходный RGB

H-канал

S-канал

V-канал

Еще одно РЕДАКТИРОВАНИЕ (проблема с черным):

В HSV: if V=0 then it is black все остальные S и H. Итак, чтобы проверить, черный ли цвет, вам нужно просто проверить компонент V, и нет смысла проверять другой.

Математическое доказательство:

C = V × S
X = C × (1 - |(H / 60º) mod 2 - 1|)
m = V - C

HSV-RGB

Ясно, что когда V=0 и что бы там ни было H,S, у нас будет: C=0 , X=0, что приводит к R,G,B=(0,0,0)

person Humam Helfawi    schedule 24.01.2016
comment
Итак, можете ли вы объяснить, почему изголовье, которое в любом разумном приближении имеет один и тот же цвет или, по крайней мере, очень плавно меняет цвет, имеет очень-очень четкие прямоугольные края на изображении H? И то же самое с одеялом на кровати, особенно в правом нижнем углу? Также кажется любопытным, что эти прямоугольники выровнены по изображению (т.е. точно вертикальны)? - person David Doria; 24.01.2016
comment
Не так уж и сложно. Перейдите сюда rapidtables.com/convert/color/rgb-to-hsv. htm и посмотрите, что такое HSV для этого значения RGB (0,0,0), (1,2,3) они оба черные, и человеческий глаз не может увидеть разницу. А вот значение H будет сюрпризом :) - person Humam Helfawi; 24.01.2016
comment
Так есть ли лучшее цветовое пространство для представления цвета изображения (то же самое, что и H в HSV), но без этих странных эффектов? Я пытаюсь определить цветовые границы, поэтому эти артефакты действительно проблематичны, поскольку алгоритмы определения краев действительно захватывают их. - person David Doria; 24.01.2016
comment
Что вы имеете в виду под цветными краями? вы можете задать еще один вопрос по вводу / выводу сэмплов - person Humam Helfawi; 26.01.2016