维基百科对标准差有一个很好的解释,您可以将其用于标准差过滤。
基本上,它归结为使用盒式滤波器模糊图像,使用盒式滤波器模糊图像的平方,并取它们之间的差的平方根。
更新:这可能更容易理解,可以使用维基百科上的公式...
![enter image description here](https://istack.dev59.com/RUFQj.webp)
可以将OpenCV的blur
函数视为感兴趣邻域的期望值(即E[X] a.k.a.样本均值)。 在这种情况下,随机样本X由局部邻域中的图像像素表示。 因此,通过使用上述等价性,我们有类似于sqrt(blur(img^2) - blur(img)^2)
在OpenCV中。 以这种方式进行操作可以计算局部均值和标准差。
此外,如果您对数学证明感兴趣,以下是一个等价的数学公式(计算方差的计算公式)。
以下是在OpenCV中执行此操作的方法:
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
Mat mat2gray(const Mat& src)
{
Mat dst;
normalize(src, dst, 0.0, 1.0, NORM_MINMAX);
return dst;
}
int main()
{
Mat image = imread("coke-can.jpg", 0);
Mat image32f;
image.convertTo(image32f, CV_32F);
Mat mu;
blur(image32f, mu, Size(3, 3));
Mat mu2;
blur(image32f.mul(image32f), mu2, Size(3, 3));
Mat sigma;
cv::sqrt(mu2 - mu.mul(mu), sigma);
imshow("coke", mat2gray(image32f));
imshow("mu", mat2gray(mu));
imshow("sigma",mat2gray(sigma));
waitKey();
return 0;
}
这会生成以下图像:
原始图像
![输入图像描述](https://istack.dev59.com/V8Zso.webp)
平均值图像
![输入图像描述](https://istack.dev59.com/9e53R.webp)
标准差图像
![输入图像描述](https://istack.dev59.com/fAclA.webp)
希望对你有所帮助!