2013-05-05 3 views
0

Я только начинаю с программирования в Opencv, я пытаюсь реализовать простой средний фильтр. Я понимаю, что в OpenCv есть встроенная функция, но я не хочу ее использовать, я хочу понять механизм фильтрации пространственных доменов и его сходство с сверткой. Ниже приводится функция, которую я написал, что берет на вход и выходGrayscale Average Filter Opencv

void averageFilter(Mat& Input,Mat& Output) 
{ 
    int row=Input.rows; 
    int col=Input.cols; 
    //uchar *input_data=Input.data; 
    //uchar *output_data=Output.data; 
    int size=1; 
    uchar count=0; 
    uchar sum=0; 

    //int nChannels=1; 

    for(int j = 1 ; j < Input.rows-1; ++j) 
    { 
     const uchar* previous = Input.ptr<uchar>(j - 1); 
     const uchar* current = Input.ptr<uchar>(j ); 
     const uchar* next  = Input.ptr<uchar>(j + 1); 

     uchar* output = Output.ptr<uchar>(j); 

     for(int i= 1;i < (Output.cols-1); ++i) 
     { 
      *output++ = (current[i] 
         +current[i-1] + current[i+1] + previous[i] +next[i]+previous[i-1]+previous[i+1]+next[i-1]+next[i+1])/9; 
     } 
    } 
} 

Это не выполняет усреднение, не могли бы вы сказать мне, что я делаю неправильно?

Спасибо

ответ

1

Вы, вероятно, получить переполнение, делая все с unsigned char, поэтому попробовать что-то вроде этого

for(int i= 1;i < (Output.cols-1); ++i) 
{ 
    double dResult = (current[i] +current[i-1] + current[i+1] + 
         previous[i] +next[i]+previous[i-1]+previous[i+1]+ 
         next[i-1]+next[i+1])/9.0; 
    *output++ = (unsigned char)dResult; 
} 

Кроме того, я думаю, что ваши previous и next строки пикселей ошибаются - вы должны быть собирая номер строки по ширине. Подобно output.

EDIT коррекция, я только что проверил документацию OpenCV и ptr является указателем строки, поэтому игнорируем мой последний комментарий!

+0

Я думаю, что понимаю, что вы имеете в виду, я попробую изменения Спасибо – Whereismywall