Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 实时图像处理:HSV图像中的噪声(openCV)_C++_Opencv_Image Processing_Noise_Hsv - Fatal编程技术网

C++ 实时图像处理:HSV图像中的噪声(openCV)

C++ 实时图像处理:HSV图像中的噪声(openCV),c++,opencv,image-processing,noise,hsv,C++,Opencv,Image Processing,Noise,Hsv,我正在做一个实时形状和颜色分类系统,精度非常高。似乎我的预处理阶段不够好,结果不如我预期的准确。以下是我正在做的: 从相机获取数据可以裁剪它以接收ROI 将ROI图像从RGB转换到HSV空间 使用中值滤波来降低HSV图像中的噪声 对图像设置阈值 用膨胀腐蚀法去除图像中的小孔和小物体 使用findContours和approxPolyDP检测方形对象 这是我的预处理阶段: image_cv = cv::cvarrToMat(image_camera); Mat cropped = image_c

我正在做一个实时形状和颜色分类系统,精度非常高。似乎我的预处理阶段不够好,结果不如我预期的准确。以下是我正在做的:

  • 从相机获取数据可以裁剪它以接收ROI
  • 将ROI图像从RGB转换到HSV空间
  • 使用中值滤波来降低HSV图像中的噪声
  • 对图像设置阈值
  • 用膨胀腐蚀法去除图像中的小孔和小物体
  • 使用findContours和approxPolyDP检测方形对象
  • 这是我的预处理阶段:

    image_cv = cv::cvarrToMat(image_camera); 
    Mat cropped = image_cv(cv::Rect(0, 190, 640, 110));
    imshow("origin", cropped);
    Mat croppedCon = CropConveyor(cropped);
    cv::cvtColor(croppedCon, croppedCon, CV_RGB2HSV);
    medianBlur(croppedCon, croppedCon, 3);
    cv::Mat binRect;
    cv::inRange(croppedCon, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), binRect);
    
    这是检测正方形的代码:

    vector<vector<Point>> contours;
    findContours(binarizedIm, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
    
    vector<Point> approx;
    for (size_t i = 0; i < contours.size(); i++)
    {
        //double arclength = arcLength(Mat(contours[i]), true);
        approxPolyDP(Mat(contours[i]), approx, 3.245 , true);   //0.04 for wood
        if (approx.size() != 4) continue;
        if (isContourConvex(Mat(approx)) && contourArea(Mat(approx)) > 250)
        {
            double MaxCos = 0;
            for (int j = 2; j < 5; j++)
            {
                double cos = angle(approx[j % 4], approx[j - 1], approx[j - 2]);
                MaxCos = MAX(cos, MaxCos);
            }
    
            if (MaxCos < 0.2)
                squares.push_back(approx);
        }
    }
    
    矢量轮廓;
    findContours(二值化、等高线、等高线、等高线、等高线近似、等高线简单);
    向量近似;
    对于(size_t i=0;i
    我认为HSV图像中的噪声是主要原因。这里有一些图片说明了我的问题。我在HSV图像中看到了很多噪声,这就是为什么我使用媒体过滤器来减少噪声,但保留边缘,因为我认为边缘信息在使用FindOntours函数时非常重要。 我的问题是:

    • HSV图像中的噪声是什么,请参考上面的图像,我该如何处理 提高我的图像质量

      • 饱和图像中出现噪声的原因是输入图像中的噪声。由于摄像头/光学元件损坏,JPEG压缩进一步增加

        这是我多年来看到的最糟糕的一张照片。你不应该再花一秒钟来处理这些问题,除非你生活在火星上,明天需要结果

        您的输入图像是超噪声、欠采样、散焦、曝光不足、充满混叠和压缩伪影以及几乎所有您可以对图像进行错误处理的内容

        信号处理的第一条规则:

        拉入=拉出


        基本上你可以免费得到更好的相机。找到并使用一个。

        饱和图像中出现噪声的原因是输入图像中的噪声。由于摄像头/光学元件损坏,JPEG压缩进一步增加

        这是我多年来看到的最糟糕的一张照片。你不应该再花一秒钟来处理这些问题,除非你生活在火星上,明天需要结果

        您的输入图像是超噪声、欠采样、散焦、曝光不足、充满混叠和压缩伪影以及几乎所有您可以对图像进行错误处理的内容

        信号处理的第一条规则:

        拉入=拉出


        基本上你可以免费得到更好的相机。找到并使用一个。

        问题的一部分在于,您正在HSV空间中进行降噪。在您的示例中,您可以看到V通道比H和S通道表现得更好。在RGB中进行降噪效果更好(RGB更线性,更接近产生噪声的相机的本色空间,尽管不完全相同;当然还有伽马校正)


        也许考虑一个更强的边缘保持降噪滤波器,例如双边滤波器。

        < P>部分问题是你在HSV空间中进行降噪。在您的示例中,您可以看到V通道比H和S通道表现得更好。在RGB中进行降噪效果更好(RGB更线性,更接近产生噪声的相机的本色空间,尽管不完全相同;当然还有伽马校正)


        也许考虑一个更强的边缘保持降噪滤波器,例如双边滤波器。

        < P>我不明白为什么你使用HSV来分割对象,RGB图像足够好。将图像分为3个通道(r、g、b),并对其应用自适应阈值。放大和腐蚀图像,然后添加(而不是合并)这3个二值图像,以获得一个二值图像。最后,执行配方的第6级来提取对象。如果噪声仍然影响结果,请在阈值之前对r、g、b通道应用双边滤波器。

        我不明白为什么要使用HSV分割对象,RGB图像已经足够好了。将图像分为3个通道(r、g、b),并对其应用自适应阈值。放大和腐蚀图像,然后添加(而不是合并)这3个二值图像,以获得一个二值图像。最后,执行配方的第6级来提取对象。如果噪声仍然影响结果,请在阈值之前在r、g、b通道上应用双边滤波器。

        是否可能改善照明或增加曝光-例如,更大的光圈或更高的ISO?尝试获得更好的相机。也许你可以从你的大学借一个。我相信即使在越南,如果你没有合适的设备,你也可以得到更好的网络摄像头。通过缩短相机距离,可以有效地将横向分辨率提高一倍。您的大部分视野都未使用。是否可以改善照明或增加曝光-例如,更大的光圈或更高的ISO?请尝试使用更好的相机。也许你可以从你的大学借一个。我相信即使在越南,如果你没有合适的设备,你也可以得到更好的网络摄像头。通过缩短相机距离,可以有效地将横向分辨率提高一倍。您的大部分视野都未使用。