最近在做一个项目(绘制等值线)但是在绘制出来后发现有很多类似锯齿状的地方不平滑,所以想找个方法实现平滑,但是在网上找了很多方法多不能达到理想的效果.
使用均值滤波试试。不过会降低幅值。
或者滑动平均滤波。
下面是我写的C++的滑动平均滤波函数
void ShiftMeanFilter(double *pDataBuffer, long bufferSize, short shiftLength)
{//滑动平均滤波
//确定采样队列长度
if (shiftLength < 4)
{
shiftLength = 4;
}
if (shiftLength >100)
{
shiftLength = 100;
}
double dbSum = 0;
double lastModify;
//计算第一采样队列的和并记住第一个位置的原始值
for (short k=0; k<shiftLength; k++)
{
dbSum += pDataBuffer[k];
}
lastModify = pDataBuffer[0];
pDataBuffer[0] = (double)(dbSum/shiftLength);
//开始向后滑动
long i;
for (i=1; i < bufferSize-shiftLength; i++)
{
dbSum += pDataBuffer[i+shiftLength]-lastModify;
lastModify = pDataBuffer[i];
pDataBuffer[i] = (double)(dbSum/shiftLength);
}
//最后一个采样队列所有的值都用i-1次获得的值填充
double lastMeanValue = pDataBuffer[i-1];
while (i < bufferSize)
{
pDataBuffer[i] = lastMeanValue;
i++;
}
}
或者滑动平均滤波。
下面是我写的C++的滑动平均滤波函数
void ShiftMeanFilter(double *pDataBuffer, long bufferSize, short shiftLength)
{//滑动平均滤波
//确定采样队列长度
if (shiftLength < 4)
{
shiftLength = 4;
}
if (shiftLength >100)
{
shiftLength = 100;
}
double dbSum = 0;
double lastModify;
//计算第一采样队列的和并记住第一个位置的原始值
for (short k=0; k<shiftLength; k++)
{
dbSum += pDataBuffer[k];
}
lastModify = pDataBuffer[0];
pDataBuffer[0] = (double)(dbSum/shiftLength);
//开始向后滑动
long i;
for (i=1; i < bufferSize-shiftLength; i++)
{
dbSum += pDataBuffer[i+shiftLength]-lastModify;
lastModify = pDataBuffer[i];
pDataBuffer[i] = (double)(dbSum/shiftLength);
}
//最后一个采样队列所有的值都用i-1次获得的值填充
double lastMeanValue = pDataBuffer[i-1];
while (i < bufferSize)
{
pDataBuffer[i] = lastMeanValue;
i++;
}
}
温馨提示:答案为网友推荐,仅供参考