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

Real-time Image Processing: Noise in HSV image (openCV)

本文关键字:噪声 openCV 图像处理 HSV 图像 实时      更新时间:2023-10-16

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

  1. 从相机获取数据可以裁剪数据以接收ROI
  2. 将ROI图像从RGB转换为HSV空间
  3. 使用中值滤波器来降低HSV图像中的噪声
  4. 设置图像阈值
  5. 使用膨胀和侵蚀来去除图像中的小孔和小物体
  6. 使用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图像中的噪声是主要原因。这里有一些图片说明了我的问题。我在HSV图像中看到了很多噪声,这就是为什么我使用媒体过滤器来减少噪声,但保留边缘,因为我认为在使用findContours函数时,边缘信息非常重要。单独通道中的HSV和HSV我的问题是:

  • HSV图像中的噪声是什么,请参阅上面的图像,我如何才能提高我的图像质量

饱和图像中出现噪声的原因是输入图像中的噪声。由坏的相机/光学器件引起,并因JPEG压缩而进一步增加。

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

你的输入图像非常嘈杂,采样不足,散焦,曝光不足,充满了混叠和压缩伪影,以及你可能对图像做的任何其他错误。

信号处理的第一条规则:

垃圾输入=垃圾输出

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

问题的一部分是在HSV空间中进行降噪。在你的例子中,你可以看到V通道比H和S通道表现得更好。最好用RGB进行降噪(它更线性,虽然不完全相同,但更接近于相机的原始颜色空间,那里是噪声的来源;当然还有伽马校正)。

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

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