首先,我的目的是实施“索沃拉算法”。
在算法中,它需要图像的均值和标准差(“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标准偏差的功能,以加快速度。
如果您知道,请告诉我......请...
答案 0 :(得分:3)
尝试使用"积分图像"来计算它。
积分图像是一种数据结构,它以非常有效的方式为您提供图像中任何ROI的值的总和。
您可以通过计算两个积分图像来计算任何给定roi的std。
获得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)
它应该适合你的方法。