Преобразование данных HSV из базы 255 в базу 359 - PullRequest
0 голосов
/ 22 мая 2019

Я использую emgucv.

Я хочу сделать hsl-фильтрацию.

цветовой диапазон от 0 до 359.

Я фильтрую желтые цвета, поэтому ищу оттенки от 30 до 60.

Я загружаю существующее растровое изображение и загружаю его как изображение hsv:

var img = new Image<Hsv, int>(@"D:\yellow.jpg");

Когда я запускаю это, я получаю:

System.NotSupportedException: 'There is an error converting Emgu.CV.Structure.Bgr to Emgu.CV.Structure.Hsv: Requested value 'Bgr2Bgr' was not found.'

Я мог бы сделать это:

var img = new Image<Hsv, byte>(@"D:\yellow.jpg");

, и это нормально загружается, но значения байтов увеличиваются только до 255.

Что еще я могу попробовать? Нужно ли умножать данные каждого пикселя на значение * 255/359?

1 Ответ

0 голосов
/ 04 июня 2019

Самый простой способ - прочитать файл. Это должно дать вам изображение RGBA. Преобразование RGBA в BGR, а затем преобразование из BGR в HLS.

Я использую Маты так:

Mat src = new Mat(@"D:\yellow.jpg");
Mat Bgr = new Mat();
Mat Hls = new Mat();
CvInvoke.CvtColor(src, Bgr, ColorConversion.Rgba2Bgr);
CvInvoke.CvtColor(Bgr, Hls, ColorConversion.Bgr2Hls);

Я думаю, что так и есть. Вы хотите сделать фильтрацию HSL, которая говорит мне, что вам нужно изображение в формате HSL. Во всех случаях в OpenCV, HSV, HSL и т. Д. Переходят только к 255, поэтому они хорошо вписываются в байт для 8-битных изображений. Если вы используете 32-битную глубину, значения не изменяются. 16-битные изображения НЕ поддерживаются. Для HSV значение для Hue составляет 0 - 180 (я использую BGR с 8-битными значениями без знака), я просто умножаю или делю на 2, но это ТОЛЬКО необходимо, если мне нужно показать это значение пользователю или получить значение Hue от пользователя. В конечном счете, это не влияет на то, как я работаю со значением Hue внутри.

HSL обрабатывается точно так же, значения оттенков для 8-битных являются 0 - 180, 16-битные не поддерживаются, а 32-битные остаются без изменений.

Doug

...