首页 文章

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

提问于
浏览
0

我正在做一个具有很高精度的实时形状和颜色分类系统 . 看起来我的预处理阶段不够好,结果不如我预期的那么准确 . 这是我正在做的事情:

  • 从相机中获取数据可以裁剪它以获得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);
    }
}

我认为HSV Image中的噪音是主要原因 . 这是一些说明我的问题的图像 . 我在HSV图像中看到了很多噪音,这就是为什么我使用媒体滤镜来减少噪音但保留边缘的原因我认为边缘信息在使用findContours函数时非常重要 . HSV and HSV in separate channels我的问题是:

  • HSV图像中的噪点是多少,请参考上图,如何提高图像的质量?

3 回答

  • 2

    饱和度图像中出现噪声的原因是输入图像中的噪声 . 相机/光学器件损坏导致JPEG压缩进一步增加 .

    到目前为止,这是我多年来看到的最糟糕的形象 . 除非你住在火星上并且明天需要结果,否则你不应再投入另一秒来处理 .

    您的输入图像超级嘈杂,欠采样,散焦,曝光不足,充满混叠和压缩瑕疵以及您可以对图像做错的其他任何事情 .

    信号处理的第一条规则:

    crap in = crap out

    你可以免费获得更好的相机 . 查找并使用一个 .

  • 1

    部分问题在于您正在降低HSV空间的噪音 . 在您的示例中,您可以看到V通道比H和S表现得更好 . 最好在RGB中进行降噪(这种噪声比相机的原始色彩空间更加线性且更接近,但不相同起源;当然还有伽马校正) .

    也许可以考虑使用更强大的边缘保护降噪滤波器,例如双边滤波器 .

  • 1

    我不明白为什么你使用HSV来分割物体,RGB图像就足够了 . 将图像分成3个通道(r,g,b)并对它们应用自适应阈值 . 扩大和侵蚀图像然后添加(不合并)这3个二进制图像以具有一个二进制图像 . 最后做你的食谱的第6级来提取对象 . 如果噪声仍然影响结果,则在阈值之前在r,g,b通道上应用双边滤波器 .

相关问题