weixin_75151975 2022-11-25 22:11 采纳率: 89.4%
浏览 26
已结题

求下列问题的完整代码

【描述】
中值滤波是对一个滑动窗口内的值进行排序,用其中值代替窗口中心点的原来值的滤波方法,它在抑制随机噪声的同时能有效保护原有信息。以一维信号的中值滤波举例。

对序列 80 120 90 200 100 110 150,假设滤波窗口宽度为5,那么有
滤波窗口的子序列

子序列排序

待替换的值

序列中值

80 120 90 200 100

80 90 10O 120 200

90

100

120 90 200 100 110

90 100 110 120 200

200

110

90 200 100 110 150

90 100 110 150 200

100

110

滤波窗口的值如果不够5个值那么不改变对应点的值, 比如左侧的80, 以它为中心的5个长度的窗口内没有5个数,所以这个点仍然是80不变。

所以最后滤波结果是80 120 100 110 110 110 150。

如果滤波窗口宽度为3,那么滤波结果是80 90 120 100 110 110 150。

【输入】
可能包含多组数据。每组数据包括2行。第一行为2个整数w、n,w为滤波窗口宽度(必须是奇数),n表示后面有n个整数。第二行为待滤波的n个整数,各数之间用一个空格来间隔。

【输出】

输出滤波后的序列,各数之间用一个空格分隔,输出需占一行,结尾需换行。如果输入w不是奇数那么输出ERROR。

样例

输入

输出

3 5

1 3 9 2 8

5 5

1 3 9 2 8

4 5

1 3 9 2 8

1 3 3 8 8

1 3 3 2 8

ERROR

img

  • 写回答

3条回答 默认 最新

  • 关注

    img

    代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include <stdio.h>
    #include <stdlib.h>
    //从小到大排序
    void bubblesort(int* a, int n)
    {
        int i, j, t;
        for (i = 0; i < n - 1; i++)
        {
            for (j = 0; j < n - 1 - i; j++)
            {
                if (a[j] > a[j + 1])
                {
                    t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
    }
    
    int main()
    {
        int* p, * q, * t;
        int w, n;
        int i, j;
        int start = 0;
        while (scanf("%d %d", &w, &n) != EOF)
        {
            //读取n个数
            p = (int*)malloc(sizeof(int) * n); //保存原始数组原始
            q = (int*)malloc(sizeof(int) * n); //保存修改后的数组
            t = (int*)malloc(sizeof(int) * w); //保存临时的w个数
            
            for (i = 0; i < n; i++)
            {
                scanf("%d", &p[i]);
                q[i] = p[i];
            }
            if (w % 2 == 0)
            {
                printf("ERROR\n");
                continue;
            }
            start = 0;
            while (start + w <= n)
            {
                //w个数字
                for (i = 0; i < w; i++)
                    t[i] = p[start + i];
                bubblesort(t, w);
                //中值替换
                q[start + w / 2] = t[w / 2];
                start++;
            }
            for (i = 0; i < n; i++)
            {
                if (i < n - 1)
                    printf("%d ", q[i]);
                else
                    printf("%d\n", q[i]);
            }
            free(p); p = 0;
            free(q); q = 0;
            free(t); t = 0;
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 已采纳回答 11月26日
  • 创建了问题 11月25日

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!