Преобразование RGB в HSV приводит к зашумленному изображению

Мое приложение работает для цветовой сегментации, но работает неправильно. Изображение справа внизу — это изображение HSV, но оно ОЧЕНЬ шумное и странное, и я понятия не имею, почему.

Изображение

Это мой код:

Image<Bgr, Byte> frame_drone = null; //Original do drone
Image<Hsv, Byte> frame_drone_hsv = new Image<Hsv, Byte>(1280, 720); //processado drone hsv
Image<Gray,Byte> frame_drone_processado = new Image<Gray, Byte>(1280, 720); //processado drone
Image<Gray, Byte> frame_drone_canny = new Image<Gray, Byte>(1280, 720); //canny drone       

int erosao = 3;
int dilatacao = 9;             
StructuringElementEx elemento_erosao = new StructuringElementEx(erosao, erosao, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT); //elemento kernelx,kernely,anchorx,anchory
StructuringElementEx elemento_dilatacao = new StructuringElementEx(dilatacao, dilatacao, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT); //elemento kernelx,kernely,anchorx,anchory            

frame_drone.SmoothMedian(3); //Filtro mediana antes da passagem para HSV
frame_drone_hsv = frame_drone.Convert<Hsv, Byte>().PyrDown().PyrUp(); //Converte a imagem da camera RGB para HSV             
frame_drone_processado = frame_drone_hsv.InRange(new Hsv(hl.Value, sl.Value, vl.Value), new Hsv(hh.Value, sh.Value, vh.Value)); //utiliza as trackbars HSV para ver a cor pretendida 

//Dilatacao seguida de erosao para fechar o ruido
CvInvoke.cvDilate(frame_drone_processado, frame_drone_processado, elemento_dilatacao, 1);
CvInvoke.cvErode(frame_drone_processado, frame_drone_processado, elemento_erosao, 1);

frame_drone_processado.SmoothGaussian(9); //Filtro gaussiano na imagem binaria        

frame_drone_canny = frame_drone_processado.Canny(new Gray(50), new Gray (150)); //Canny

//Show Pictureboxes
picturebox_canny.Image = frame_drone_canny.Bitmap; // Mostra imagem canny
picturebox_hsv.Image = frame_drone_hsv.Bitmap; //mostra imagem hsv
processadamaster.Image = frame_drone_processado.Bitmap; //Mostra a imagem processada
originalmaster.Image = frame_drone.Bitmap; // Mostra a imagem original

Что случилось? Есть идеи? :/

Редактировать: я знаю, что диапазон оттенков составляет от 0 до 255. Я просто проверял, не было ли это 0-360, когда я делал фото

Редактировать 2: я попытался использовать функцию CvtColor, и программа закрылась.

 CvInvoke.cvCvtColor(frame_drone, frame_drone_hsv, COLOR_CONVERSION.CV_BGR2HSV); 

Ошибка: Exception thrown: 'Emgu.CV.Util.CvException' in Emgu.CV.dll

Но если я сделаю

CvInvoke.cvCvtColor(frame_drone, frame_drone, COLOR_CONVERSION.CV_BGR2HSV);

Он отлично работает, но у меня есть изображение HSV на исходном изображении, и я не могу использовать:

frame_drone_processado = frame_drone_hsv.InRange(new Hsv(hl.Value, sl.Value, vl.Value), new Hsv(hh.Value, sh.Value, vh.Value)); //utiliza as trackbars HSV para ver a cor pretendida 

Потому что он говорит:

Cannot Convert Bgr to Hsv

person Community    schedule 01.01.2016    source источник


Ответы (1)


Я знаю, что это глупо, но может помочь кому-то. Это работает следующим образом:

// Convert image from RGB to HSV
frame_drone_hsv = frame_drone.Convert<Hsv, Byte>().PyrDown().PyrUp(); 
CvInvoke.cvCvtColor(frame_drone_hsv, frame_drone_hsv, COLOR_CONVERSION.CV_BGR2HSV); 

Но все равно много шума. Есть ли лучший подход, чем мой?

person Community    schedule 01.01.2016
comment
Вместо этого вы должны использовать цветовое пространство YUV. - person aybe; 01.01.2016
comment
Есть ли веская причина для этого? Все говорят использовать HSV. Проблема в том, что мне нужно обнаружить несколько цветов в квадратах (например, красный, синий, зеленый, желтый), поэтому мне нужно оставить оттенок на уровне 0-255. - person ; 01.01.2016
comment
Типа изображения Yuv нет. Есть только Ycc Image‹Yuv, Byte› frame_drone_yuv = new Image‹Yuv, Byte›(1280, 720); - person ; 01.01.2016
comment
Дело в том, что HSV - это псевдоцветовое пространство, довольно устаревшее и не уважающее то, что на самом деле является цветом, особенно. насыщенность. - person aybe; 01.01.2016