【问题标题】:RGB to HSV conversion results in noisy imageRGB 到 HSV 的转换导致图像有噪点
【发布时间】:2016-01-01 00:21:58
【问题描述】:

我的应用程序正在处理颜色分割,但无法正常工作。右下角的图像是 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

【问题讨论】:

    标签: c# image rgb hsv


    【解决方案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); 
    

    但仍然有很多噪音。有比我更好的方法吗?

    【讨论】:

    • 你应该改用 YUV 颜色空间。
    • 这样做有充分的理由吗?每个人都说要使用 HSV。问题是我需要检测正方形中的多种颜色(如红色、蓝色、绿色、黄色),所以我需要将色调保持在 0-255。
    • 没有 Yuv 图像类型。只有Ycc Image frame_drone_yuv = new Image(1280, 720);
    • 问题是 HSV 是一个相当过时的伪色彩空间,并且不尊重真正的颜色,尤其是。饱和度。
    猜你喜欢
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多