当前位置: 首页 > article >正文

常用滤波算法之中位值滤波算法

中位值滤波算法简介:

连续采样N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。这种方法能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。

中位值滤波C语言编码实现:

#include <stdio.h>
#include <stdlib.h>

#define MAX 255
#define WINDOW_SIZE 3

void sort(int arr[], int n) {
int i, j, temp;
for (i = ; i < n - 1; i++) {
for (j = ; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}

void medianFilter(int imgWidth, int imgHeight, unsigned char imgData[]) {
int i, j, k, l, m;
int window[WINDOW_SIZE * WINDOW_SIZE];
int windowCenter;

for (i = 1; i < imgHeight - 1; i++) {
    for (j = 1; j < imgWidth - 1; j++) {
        // Extract the 3x3 window
        k = ;
        for (l = -1; l <= 1; l++) {
            for (m = -1; m <= 1; m++) {
                window[k++] = imgData[(i + l) * imgWidth + (j + m)];
            }
        }

        // Sort the window
        sort(window, WINDOW_SIZE * WINDOW_SIZE);

        // Replace the center pixel with the median value
        windowCenter = window[WINDOW_SIZE * WINDOW_SIZE / 2];
        imgData[i * imgWidth + j] = windowCenter;
    }
}

}

int main() {
// Example usage
int imgWidth = 5;
int imgHeight = 5;
unsigned char imgData[imgWidth * imgHeight] = {
10, 20, 30, 4, 50,
60, 7, 80, 9, 100,
110, 120, 130, 140, 150,
160, 170, 180, 190, 200,
210, 220, 230, 240, 250
};

printf("Original Image:\n");
for (int i = ; i < imgHeight; i++) {
    for (int j = ; j < imgWidth; j++) {
        printf("%3d ", imgData[i * imgWidth + j]);
    }
    printf("\n");
}

medianFilter(imgWidth, imgHeight, imgData);

printf("\nFiltered Image:\n");
for (int i = ; i < imgHeight; i++) {
    for (int j = ; j < imgWidth; j++) {
        printf("%3d ", imgData[i * imgWidth + j]);
    }
    printf("\n");
}

return ;

}
代码解释:
sort函数:用于对窗口内的像素值进行排序。
medianFilter函数:实现中值滤波的核心逻辑。它遍历图像的每个像素(除了边界),提取3x3窗口,对窗口内的值进行排序,并用中值替换中心像素。
main函数:提供了一个简单的5x5图像数据示例,调用medianFilter函数进行滤波,并打印原始和滤波后的图像。


http://www.kler.cn/a/452978.html

相关文章:

  • Artec Space Spider助力剑桥研究团队解码古代社会合作【沪敖3D】
  • centos server系统新装后的网络配置
  • 安卓 自定义矢量图片控件 - 支持属性修改矢量图路径颜色
  • Go入门篇:(一)golang的安装和编辑工具安装
  • MySQL深度解析:高效查询优化与实战案例
  • 【JAVA高级篇教学】第四篇:MySQL 5.7 与 MySQL 8 的区别
  • 【LeetCode】394、字符串解码
  • python怎么看矩阵维数
  • 低代码配置式组态软件-BY组态
  • 深入理解 MySQL 索引
  • 数据流动背后的“暗流涌动”,企业如何借助多源威胁检测响应高效捕捉安全威胁?
  • IDEA无法打开插件市场的解决
  • 微信小程序 不同角色进入不同页面、呈现不同底部导航栏
  • 嵌入式学习-QT-Day04
  • 鸿蒙主体分割/剔除背景
  • 任务三数据库加固
  • 【每日学点鸿蒙知识】数据迁移、大量图片存放、原生自定义键盘调用、APP包安装到测试机、photoPicker顶部高度
  • (八)循环神经网络_门控循环单元GRU
  • 从汽车企业案例看仓网规划的关键步骤(视频版)
  • 项目文档-代码检查报告