高斯、中值等滤波器在使用的需要填充边界
如果你把窗口放到第一个或最后一个元素上,那么这个窗口的左边或右边就会是空的。为了填补这个间隙,信号需要被扩展一下。
扩充的示意图如下
// FilterFill.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <fstream>
//高斯或者中值等滤波器使用过程中需要向外填充一定范围的数值
//滤波器的长宽为hh,ww,则half_filter_width = (ww-1)/2,half_filter_height = (hh-1)/2
/*
@param [out]
@param [in]
@param [in] width of src
@param [in] height of src
@param [in] half width of filter
@param [in] half height of filter
*/
void FliterFill(int *dst, int *src, int width, int height, int half_filter_width, int half_filter_height)
{
//中间重叠部分
for(int i = 0; i < height; i++)
{
memcpy(dst + ((width + 2 * half_filter_height) *(i+half_filter_height) + half_filter_height), src + width * i, width * sizeof(int));
}
//左侧
for (int i = 0; i < height; i++)
{
for (int j = 0; j < half_filter_width; j++)
{
dst[(width + 2 * half_filter_height)*(i + half_filter_width) + j] = src[width * i];
}
}
//右侧
for (int i = 0; i < height; i++)
{
for (int j = 0; j < half_filter_width; j++)
{
dst[(width + 2 * half_filter_height)*(i + half_filter_width + 1) - 1 - j] = src[width*(i + 1) - 1];
}
}
//前half_filter_height行
for (int i = 0; i < half_filter_height; i++)
{
memcpy(dst + i * (width + 2 * half_filter_width), dst + half_filter_height * (width + 2 * half_filter_width), (width + 2 * half_filter_width) * sizeof(int));
}
//后half_filter_height行
for (int i = 0; i < half_filter_height; i++)
memcpy(dst + (width + 2 * half_filter_width)*(height + half_filter_height + i), dst + ((width + 2 * half_filter_width)*(height - 1 + half_filter_height)), (width + 2 * half_filter_width) * sizeof(int));
}
int main()
{
int *src = new int[800 * 600];
int *dst = new int[806 * 606];
memset(dst, 0, 806 * 606 * sizeof(int));
for (int i = 0; i < 600; i++)
{
for (int j = 0; j < 800; j++)
{
int index = i * 800 + j;
src[index] = index;
}
}
std::fstream fs;
fs.open("src.txt", std::fstream::out);
for (int i = 0; i < 600; i++)
{
for (int j = 0; j < 800; j++)
{
fs << src[i * 800 + j] << "\t";
}
fs<<"\n";
}
fs.close();
FliterFill(dst, src, 800, 600, 3, 3);
fs.open("dst.txt", std::fstream::out);
for (int i = 0; i < 606; i++)
{
for (int j = 0; j < 806; j++)
{
fs << dst[i * 806 + j] << "\t";
}
fs << "\n";
}
fs.close();
std::cout << "Hello World!\n";
}