c语言用一维数组做中值滤波,快速中值滤波及c语言实现

快速中值滤波及c语言实现 学生姓名:刘勇学号: 6100410218 专业班级:数媒101 【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题.解决了由于图像太大而内存不够的问题,运用对程序运行时的方法,得出在PENTIUM-S100MHz上中值滤渡的一般算法运行4.23秒.而快速算法运行2 58秒。

【关键词】c语言;中值滤波;快速算法

1 引言

中值滤波是涂基发明的一种非线性信号处理技术,对抑制图像的噪声非常有效,在二维形式下,中值滤渡器是一个古有奇数个像素的滑动窗口,窗口正中的象素的灰度值用窗口内各个象素的中值代替窗口的中值为窗口中象素按大小顺序排列后处于中间位置的象素;本文讨论中值滤的一般算法并比较其运算速度。 2 用C语言实现算法的若干问题

在设计算法编制程序的时候,我们充分考虑到程序运行的时间复杂度和空间复杂度问题,在解决问

题的前提下,使算法尽量简单,使程序运行占有的空间尽量的小,这样来减少不必要的时问浪费和空间浪费,从而太大的提高程序执行的效率。

首先考虑到的内存问题。由于在本文算法中用的图像是512+512 8bit,这就存在一个内存不够大一整幅图像不能一次性调入的问题。为了解受此问题,可以只开辟一个3"512的缓冲区n,将原图像采用分批调入缓冲区,使内存不够的问题得到了圆满的解决。

另外为了对中值滤波的快速算法和普通算法进行精确的比较,采用对程序运行计时的方法,并精确计算每个算法运行的时间,使得出的结论更可靠。 3 中值滤波算法的C语言程序实现

本算法采用对开辟的3*512的缓冲区从左到右依次形成一个3*3的窗口.然后将此3*3的窗口放

人一个一维数组中,调用求中值子函数.通过排序得出中值,当此中值不等于窗口中间位置的象素时.用此中值来代替窗VI中间位置的象素灰度值.若此缓冲区处理完毕后,将缓冲区的第一行存入新建的文件中,将第二、第三行分别向上移动一行,若存人新建的文件中的行数小于或等于511(即这样处理的行

数小于或等于511),则从原文件中调入一行作为缓冲区第三行,按上述方法进行直到处理的总行数等于511为止,最后,将缓冲区的第二、三行存人新建的文件,程序流程框图如图1

4 中值滤波快速算法的C语言程序实现

本算法充分利用了上一次处理的结果.采用迭代,逐次逼近的方法得到本次的中值,在一行处理完毕后转人下一行也采用走S型的方法.这样除第一个窗口采用了一伏排序得到中值外,其它的窗口都利

用上伏的窗口的象素删除无用的3个象素后再加人新的3个象素,利用迭代的方法得到本次窗口的中值.这样太大地提高了程序执行的效率。

4.1算法的解释

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很高兴能为您解答问题!关于用C语言实现一维数据的中值滤波,可以参考以下代码实现: ```c #include <stdio.h> // 中值滤波 int median_filter(unsigned char *input, unsigned char *output, int length, int window_size) { int half = window_size / 2; // 滑动窗口大小的一半 unsigned char temp[window_size]; // 临时保存数据的数组 int i, j, k, top; // i: 表示窗口窗口左边界,j: 表示窗口右边界,k: 表示数据的下标,top: 为计数器 // 开始滤波,从第一个数据开始到倒数第二个数据 for (i = 0, j = window_size - 1, k = half; j < length; i++, j++, k++) { // 将数据移入临时数组,进行排序 for (top = 0; top < window_size; top++) { temp[top] = input[top + i]; } // 冒泡排序 for (top = 0; top < window_size - 1; top++) { for (int m = top + 1; m < window_size; m++) { if (temp[top] > temp[m]) { unsigned char t = temp[top]; temp[top] = temp[m]; temp[m] = t; } } } // 找到中间数 output[k] = temp[half]; } return k - half; // 返回滤波后数据的长度 } int main() { unsigned char input[] = { 10, 30, 20, 40, 50, 10, 30, 20, 50, 20 }; unsigned char output[10]; int length = sizeof(input) / sizeof(unsigned char); int window_size = 3; int result_length = median_filter(input, output, length, window_size); printf("Input: "); for (int i = 0; i < length; i++) { printf("%d ", input[i]); } printf("\nOutput: "); for (int i = 0; i < result_length; i++) { printf("%d ", output[i]); } return 0; } ``` 代码中实现了一个简单的中值滤波算法,输入为一个一维数据(数组),输出为滤波后的数据。该算法采用滑动窗口的方式对数据进行处理,经过排序后找到每个窗口的中位数作为该窗口的输出。输入的数据和输出的数据都是 `unsigned char` 类型的数组, `length` 表示输入数据的长度, `window_size` 表示滑动窗口的大小。调用方式为 `median_filter(input, output, length, window_size)`,返回值为输出数据的长度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值