全站数据
8 4 2 0 5 8 1

用C++语言实现中值滤波

普通专升本 | 简单学习,快乐成才!         
问题更新日期:2024-10-22 10:55:00

问题描述

用C++语言实现中值滤波求高手给解答
精选答案
最佳答案

第一步是放置窗口,这里我们通过改变开始的索引值来放置窗口。

// Move window through all elements of the signal

for (int i = 2; i < N - 2; ++i)

注意,我们是从第三个元素开始,倒数第三个元素结束。问题就是我们无法从第一个元素开始,因为在这种情况下,过滤窗口的左半部分是空的。我们将在之后讨论如何解决这个问题。

第二步就是取出窗口中的元素。

// Pick up window elements

for (int j = 0; j < 5; ++j)

window[j] = signal[i - 2 + j];

第三步就是把窗口中的元素排序。但是在这里我们将会使用一个代码优化的技巧。由于我们需要的仅仅是中值,所以我们只要给一半的元素排序就可以了。

// Order elements (only half of them)

for (int j = 0; j < 3; ++j)

{

// Find position of minimum element

int min = j;

for (int k = j + 1; k < 5; ++k)

if (window[k] < window[min])

min = k;

// Put found minimum element in its place

const element temp = window[j];

window[j] = window[min];

window[min] = temp;

}

最后一步——取中值。

// Get result - the middle element

result[i - 2] = window;

最后,让我们把整个算法写成函数的形式,

// 1D MEDIAN FILTER implementation

// signal - input signal

// result - output signal

// N- length of the signal

void _medianfilter(const element* signal, element* result, int N)

{

// Move window through all elements of the signal

for (int i = 2; i < N - 2; ++i)

{

// Pick up window elements

element window;

for (int j = 0; j < 5; ++j)

window[j] = signal[i - 2 + j];

// Order elements (only half of them)

for (int j = 0; j < 3; ++j)

{

// Find position of minimum element

int min = j;

for (int k = j + 1; k < 5; ++k)

if (window[k] < window[min])

min = k;

// Put found minimum element in its place

const element temp = window[j];

window[j] = window[min];

window[min] = temp;

}

// Get result - the middle element

result[i - 2] = window;

}

}

类型element可以这样定义:

typedef double element;

1