c++ - 如何计算具有特定 roi 大小的图像的 std dev?

标签 c++ opencv c++11 image-processing standard-deviation

首先,我的目的是实现“Sauvola 的算法”。

在算法中,它需要图像的均值和标准差(“std dev”)以及像卷积滤波器一样的 ROI。

我已经使用函数“blur”获得了平均值,它是均值过滤器。

然而,“std dev”需要很多函数,如模糊、乘法、减法和平方根。

这一步消耗对我的设备“Note3”来说太重了,它是 Android 设备。

下面的代码是现在如何计算“std dev”的方法。

PARAM_WINDOW_SIZE = 15;

blur(grayF, mean, cv::Size(PARAM_WINDOW_SIZE, PARAM_WINDOW_SIZE), 
              cv::Point(-1, -1), BORDER_REPLICATE);

meanSQ = mean.mul(mean);
grayF_SQ = grayF.mul(grayF);
blur(grayF_SQ, grayF_SQ, cv::Size(PARAM_WINDOW_SIZE, PARAM_WINDOW_SIZE), 
              cv::Point(-1, -1), BORDER_REPLICATE);
sqrt(grayF_SQ - meanSQ, deviation);

换句话说,我想知道从整个图像中获取每个 ROI 的标准差以加快速度的函数。

如果你知道,请告诉我...请...

最佳答案

尝试使用“积分图像”来计算它。

Integral 图像是一种数据结构,它以非常有效的方式为您提供图像中任何 ROI 的值总和。

您可以使用它通过计算两个积分图像来计算任何给定 roi 的标准值。

  1. I1 = 第一张积分图是原图的积分图
  2. I2 = 第二个积分图像是图像的逐点平方的积分图像(即每个像素值乘以自身)

获取标准的公式为:

1/n*(S2 -(S1)^2/n)

其中 n 是 roi 中的像素数。

S2 - 积分图I2对于roi的值

S1——积分图I1对于roi的值

更深入的解释请看: https://en.wikipedia.org/wiki/Summed_area_table

具体转到“要计算 block 的方差或标准差,我们需要两个积分图像:”这一行。

祝你好运

关于c++ - 如何计算具有特定 roi 大小的图像的 std dev?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45070522/

相关文章:

c++ - 临时缓冲区 : Local or member variable?

c++ - std::bind2nd 的替代品

java - 如何使用 OpenCV 将图像转换为黑白图像并去除 android 中的阴影

java - 如何在java中使用Opencv加载视频文件

c++ - 如何在C++中过滤对象

c++ - 2个 future 之间的依赖

c++ - 为什么即使链接了适当的 .lib,此 C++ 项目仍无法构建?

python - 如何在 opencv python 中打开一个大的 bin 文件(~ 8 GB 图像流)?

c++ - 如何在 C++ 中为 sqlite 进行非静态回调?

c++ - 我怎样才能清楚地指定我要传递哪些参数以及哪些参数保持默认?