- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
在视差图中过滤掉小的噪声斑点(speckles)。
cv::filterSpeckles 是 OpenCV 库中的一个函数,用于过滤图像或视差图(disparity map)中的小噪声斑点(speckles)。这些斑点通常是由于噪声引起的不希望存在的小区域。通过设定最大斑点大小和斑点与其周围区域之间的亮度差异阈值,该函数能够识别并移除这些斑点,从而提高图像质量或后续处理的准确性。
函数原型
void cv::filterSpeckles
(InputOutputArray img,double newVal,int maxSpeckleSize,double maxDiff,InputOutputArray buf = noArray()
)
参数
- 参数img 输入的16位有符号视差图像
- 参数newVal 用于填充斑点的视差值
- 参数maxSpeckleSize 被视为斑点的最大斑点大小。更大的区域不会受到算法的影响
- 参数maxDiff 邻近视差像素之间的最大差异,以将它们归为同一个斑点。请注意,由于 StereoBM、StereoSGBM 以及其他算法返回的是定点视差图(其中视差值乘以16),因此在指定此参数值时应考虑这个缩放因子。
- 参数buf 可选的临时缓冲区,以避免在函数内部进行内存分配。
代码示例
#include <iostream>
#include <opencv2/opencv.hpp>
#include <random>int main()
{// 创建一个 400x400 的灰度图像,初始值为128(中性灰色)cv::Mat img( 400, 400, CV_8UC1, cv::Scalar( 128 ) );// 使用随机数生成器添加一些随机噪声(speckles)std::default_random_engine generator;std::uniform_int_distribution< int > distribution( 0, 255 );for ( int i = 0; i < 1000; ++i ){ // 添加1000个随机噪声点int x = distribution( generator ) % img.cols;int y = distribution( generator ) % img.rows;img.at< uchar >( y, x ) = distribution( generator ); // 随机亮度值}// 显示原始带噪声的图像cv::imshow( "Original Image with Speckles", img );// 定义 filterSpeckles 函数所需的参数double newVal = 128; // 将斑点替换为背景颜色(中性灰色)int maxSpeckleSize = 50; // 最大斑点尺寸为50个像素double maxDiff = 32.0; // 斑点和周围像素的最大亮度差// 创建一个缓冲区用于内部计算cv::Mat buf;// 应用 filterSpeckles 过滤器cv::filterSpeckles( img, newVal, maxSpeckleSize, maxDiff, buf );// 显示结果图像cv::imshow( "Filtered Image", img );cv::waitKey( 0 );return 0;
}