gpt4 book ai didi

OpenCV 均值/SD 过滤器

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:59 29 4
gpt4 key购买 nike

我把它扔在那里,希望有人会尝试过这种荒谬的事情。我的目标是获取输入图像,并根据每个像素周围小窗口的标准差对其进行分割。基本上,这在数学上应该类似于高斯或盒式过滤器,因为它将应用于编译时(甚至运行时)用户在每个像素周围指定的窗口大小,并且目标数组将包含每个像素的 SD 信息,在与原始尺寸相同的图像中。

我的想法是在 HSV 空间中的图像上执行此操作,以便我可以轻松找到颜色均匀的区域(即那些在 Hue 和 Sat 平面中具有小局部 SD 的区域)并从图像中提取它们以获得更多信息 -深度加工。

那么问题来了,有没有人曾经构建过这样的自定义过滤器?我不知道如何在用于高斯和模糊的简单盒型过滤器内核中执行 SD,所以我猜我必须使用 FilterEngine 构造。另外,我忘了说我是用 C++ 做的。

非常感谢您的建议和想法。

最佳答案

维基百科对 standard deviation 有很好的解释,您可以将其用于标准偏差过滤器。

基本上,它归结为用盒式滤波器模糊图像,用盒式滤波器模糊图像的正方形,然后对它们的差值求平方根。

更新:这可能用维基百科的方程式更好地展示了...... enter image description here

您可以将 OpenCV blur 函数视为表示 expected value (即,E[X] a.k.a. 样本均值)感兴趣的邻域。在这种情况下,随机样本 X 由局部邻域中的图像像素表示。因此,通过使用上述等价关系,我们在 OpenCV 中得到类似 sqrt(blur(img^2) - blur(img)^2) 的东西。这样做可以让您计算局部均值和标准差。

此外,以防万一您对数学证明感到好奇。这种等价被称为 computational formula for variance .

以下是如何在 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;
}

这会产生以下图像:

原创

enter image description here

均值

enter image description here

标准差

enter image description here

希望对您有所帮助!

关于OpenCV 均值/SD 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456565/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com