среднее значение и дисперсия изображения за один проход - PullRequest
3 голосов
/ 09 апреля 2010

я пытаюсь вычислить среднее и дисперсию, используя окно 3X3 над изображением (hXw) в opencv ... вот мой код ... есть ли проблемы с точностью с этим ?? или есть какой-либо другой эффективный способ сделать это в один проход .?

int pi,a,b;

for(i=1;i<h-1;i++)
{
    for(j=1;j<w-1;j++)
    {   int sq=0,sum=0;
        double mean=0;
        double var=0;
        for(a=-1;a<=1;a++)
        {
            for(b=-1;b<=1;b++)
            {
                pi=data[(i+a)*step+(j+b)];
                sq=pi*pi;
                sum=sum+sq;
                mean=mean+pi;
            }
        }
        mean=mean/9;
        double soa=mean*mean;//square of average
        double aos=sum/9;//mean of squares
        double var=aos-soa;//variance
    }
}

Ответы [ 4 ]

3 голосов
/ 10 апреля 2010

Что касается эффективности вычислений, я бы рекомендовал делать это в области Фурье вместо области времени (изображения) с использованием сверток. Помните, что свертка - это простое умножение в области Фурье. Как и во временных рядах, где функция спектральной плотности представляет собой дисперсию, разлагаемую в зависимости от частоты, для изображения можно расширить ее на два измерения. Должно быть намного лучше, чем вложенные циклы for.

У меня нет кода на данный момент. но этот метод использовался в таких алгоритмах, как «быстрое сопоставление с шаблоном» для обнаружения объектов или регистрации изображений.

3 голосов
/ 09 апреля 2010

Это довольно хорошо изученная тема, см., Например. эта статья в Википедии о вычислениях отклонений .

Одна из проблем, которая иногда упоминается, - это накопленные числовые ошибки; вам нужно решить, может ли это быть проблемой. Если значения, по которым вы вычисляете, схожи по диапазону, это может быть меньшей проблемой.

0 голосов
/ 01 июля 2010

Вы должны лучше использовать интегралы изображения для быстрого вычисления среднего значения и стандартного отклонения! Все, что вам нужно в этом случае, это правильно рассчитать границы окна маски в каждой позиции изображения. Это будет намного быстрее. Если вам понадобится образец кода, пожалуйста, попросите об этом.

0 голосов
/ 09 апреля 2010

У вас должно быть все в порядке даже с плавающими над таким небольшим количеством пикселей. Как правило, вам нужно удваивать, если вы делаете подобные вещи на всем изображении.

...