当前位置:新励学网 > 秒知问答 > 用C++语言实现中值滤波

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

发表时间:2024-07-27 23:29:23 来源:网友投稿

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

// 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

免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。

如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!