如何用特定的roi大小计算图像的std dev?

时间:2017-07-13 02:34:37

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

首先,我的目的是实施“索沃拉算法”。

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

我已经使用函数“blur”获得了平均值,这是函数的平均值。

然而,“std dev”需要很多函数,分别是Blur,Multiply,Minus和Square root。

此步骤消耗对我的设备来说太重了,“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标准偏差的功能,以加快速度。

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

2 个答案:

答案 0 :(得分:3)

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

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

您可以通过计算两个积分图像来计算任何给定roi的std。

  1. I1 =第一个积分图像是原始图像的整体图像
  2. I2 =第二个积分图像是图像的点方形的整数图像(即每个像素值乘以其自身)
  3. 获得std的公式将是:

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

    其中n是roi中的像素数。

    S2 - roi的积分图像I2的值

    S1 - roi的积分图像I1的值

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

    具体到第一行"为了计算块的方差或标准偏差,我们需要两个积分图像:"并且。

    祝你好运

答案 1 :(得分:0)

检查

cv.AvgSdv(arr,mask = None) - > (意思是,stdDev)

它应该适合你的方法。