Оттенки серого Средний фильтр OpenCV

Я только начинаю с программирования в Opencv, я пытаюсь реализовать простой средний фильтр. Я понимаю, что в 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;
}
}
}

Это не выполняет усреднение, скажите, пожалуйста, что я делаю неправильно?

Спасибо

0

Решение

Вы, вероятно, получаете переполнение, делая все с 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,

РЕДАКТИРОВАТЬ исправление, я только что проверил документацию OpenCV и ptr указатель строки, так что проигнорируйте мой последний комментарий!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]