实时图像处理:HSV图像中的噪声(openCV)
Real-time Image Processing: Noise in HSV image (openCV)
我正在做一个具有非常高精度的实时形状和颜色分类系统。我的预处理阶段似乎不够好,所以结果没有我预期的那么准确。以下是我正在做的:
- 从相机获取数据可以裁剪数据以接收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图像中的噪声是主要原因。这里有一些图片说明了我的问题。我在HSV图像中看到了很多噪声,这就是为什么我使用媒体过滤器来减少噪声,但保留边缘,因为我认为在使用findContours函数时,边缘信息非常重要。单独通道中的HSV和HSV我的问题是:
- HSV图像中的噪声是什么,请参阅上面的图像,我如何才能提高我的图像质量
饱和图像中出现噪声的原因是输入图像中的噪声。由坏的相机/光学器件引起,并因JPEG压缩而进一步增加。
这是我多年来看到的最糟糕的照片。除非你生活在火星上,明天需要结果,否则你不应该再花一秒钟的时间来处理这个问题。
你的输入图像非常嘈杂,采样不足,散焦,曝光不足,充满了混叠和压缩伪影,以及你可能对图像做的任何其他错误。
信号处理的第一条规则:
垃圾输入=垃圾输出
你基本上可以免费得到更好的相机。找到并使用一个。
问题的一部分是在HSV空间中进行降噪。在你的例子中,你可以看到V通道比H和S通道表现得更好。最好用RGB进行降噪(它更线性,虽然不完全相同,但更接近于相机的原始颜色空间,那里是噪声的来源;当然还有伽马校正)。
也许可以考虑一个更强的边缘保持降噪滤波器,如双边滤波器。
我不明白为什么要使用HSV来分割对象,RGB图像就足够了。将图像分离为3个通道(r、g、b),并在它们上应用自适应阈值。扩展和侵蚀图像,然后将这3个二进制图像相加(而不是合并)以具有一个二进制图像。最后,按照食谱的第6级提取对象。如果噪声仍然影响结果,则在阈值之前对r、g、b通道应用双边滤波器。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将OpenCV C++重写为EmguCV C#-如何使用指针
- OpenCV C++.快速计算混淆矩阵
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 哪些库可以通过Opencv调整曝光率
- 安装opencv失败-粘贴CMakeError.log的内容
- C++中的openCV Mat访问冲突
- OpenCV Android C++ imwrite not found
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- CV_OCL_RUN宏如何在OpenCV(版本3.4.5)的goodFeaturesToTrack实现中工作?
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用Kalman滤波器来filt噪声,而不会延迟OpenCV C
- OpenCV噪声消除静态摄像机的视频
- 实时图像处理:HSV图像中的噪声(openCV)
- 使用openCV去除二进制图像中的噪声