首先,我的目的是实现“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 的标准值。
- I1 = 第一张积分图是原图的积分图
- 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/