C++ 灰度平均滤波器Opencv
我刚刚开始在Opencv中编程,我正在尝试实现一个简单的平均过滤器。我知道OpenCv中有一个内置函数,但我现在还不想使用它,我希望了解空域过滤机制及其与卷积的相似性。下面是我编写的一个函数,它接受输入和输出C++ 灰度平均滤波器Opencv,c++,opencv,average,grayscale,smoothing,C++,Opencv,Average,Grayscale,Smoothing,我刚刚开始在Opencv中编程,我正在尝试实现一个简单的平均过滤器。我知道OpenCv中有一个内置函数,但我现在还不想使用它,我希望了解空域过滤机制及其与卷积的相似性。下面是我编写的一个函数,它接受输入和输出 void averageFilter(Mat& Input,Mat& Output) { int row=Input.rows; int col=Input.cols; //uchar *input_data=Input.data; //uc
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;
}
}
}
void average过滤器(Mat和输入、Mat和输出)
{
int row=Input.rows;
int col=Input.cols;
//uchar*input_data=input.data;
//uchar*output_data=output.data;
int size=1;
uchar计数=0;
uchar和=0;
//int n通道=1;
对于(int j=1;j
这不能进行平均,你能告诉我我做错了什么吗
谢谢使用
无符号字符
进行任何操作都可能会导致溢出,因此请尝试以下方法
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;
}
for(int i=1;i<(Output.cols-1);+i)
{
双数据结果=(电流[i]+电流[i-1]+电流[i+1]+
上一个[i]+下一个[i]+上一个[i-1]+上一个[i+1]+
next[i-1]+next[i+1])/9.0;
*输出++=(无符号字符)dResult;
}
另外,我认为您的上一行
和下一行
像素是错误的-您需要将行号与宽度进行相互匹配。与输出类似
编辑更正,我刚刚检查了OpenCV文档,并且ptr
是一个行指针,所以忽略我最后的评论 我想我明白你的意思了,我会尝试改变的谢谢