均值滤波
void meanfilter(Mat src, Mat dst, int kernalsize)
{
int ksize;
vector<uchar> tempdata;
tempdata.clear();
if (kernalsize % 2 == 0)
{
ksize = kernalsize / 2;
}
else
{
ksize = (kernalsize - 1) / 2;
}
if (kernalsize>src.rows || kernalsize>src.cols)
cout << "核输入过大" << endl;
for (int i = ksize; i < src.rows - ksize; i++)
{
uchar* datadst = dst.ptr<uchar>(i);
for (int j = ksize; j < src.cols - ksize; j++)
{
for (int l = i - ksize; l <= i + ksize; l++)
{
uchar* datatemp = src.ptr<uchar>(l);
for (int k = j - ksize; k <= j + ksize; k++)
{
tempdata.push_back(datatemp[k]);
}
}
int tempsum = 0;
for (size_t tempi = 0; tempi < tempdata.size(); tempi++)
{
tempsum += tempdata[tempi];
}
double s = 1.0 / (kernalsize*kernalsize);
datadst[j] = s*tempsum;
tempdata.clear();
}
}
return;
}
修改:新方法解决了边界像素问题。而原始做法是将原图边界复制,即边界像素不做处理。
Mat mean(Mat src, int kernelSize)
{
Mat dst = src.clone();
int padding=0;
if (kernelSize % 2 == 0)
{
padding = kernelSize / 2;
}
else
{
padding = (kernelSize - 1) / 2;
}
if (kernelSize>src.rows || kernelSize>src.cols)
cout << "核输入过大" << endl;
Mat addsrc(src.rows + padding, src.cols + padding, CV_8U);
//将src边界放大,解决了边界像素的处理问题
copyMakeBorder(src, addsrc, padding, padding, padding, padding, BORDER_CONSTANT, Scalar(255));
for (int i = 0;