Прежде всего, моя цель — реализовать «Алгоритм Сауволы».
В алгоритме требуется среднее значение изображения и стандартное отклонение («стандартное отклонение») с ROI-подобным сверточным фильтром.
Уже я получаю среднее значение, используя функцию «размытие», которая является средним фильтром.
Однако для «std dev» нужно много функций: Blur, Multiply, Minus и Square root.
Этот шаг потребляет слишком много для моего устройства, «Note3», которое является устройством Android.
Код ниже — это способ вычисления «стандартного отклонения» сейчас.
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 путем вычисления двух интегральных изображений.
Чем формула для получения стандартного будет:
1 / n * (S2 — (S1) ^ 2 / n)
Где n — количество пикселей в roi.
S2 — значение интегрального изображения I2 для
S1 — значение интегрального изображения I1 для
Для более глубокого объяснения, пожалуйста, посмотрите на:
https://en.wikipedia.org/wiki/Summed_area_table
В частности, перейдите к строке «Чтобы вычислить дисперсию или стандартное отклонение блока, нам нужны два интегральных изображения:» и вкл.
Удачи
Проверьте
cv.AvgSdv (обр, маска = нет) -> (среднее значение, stdDev)
метод это должно работать для вас.