基于MATLAB的图像中值滤波

程序概要

基于MATLAB的中值滤波程序,用于读取7680x4320分辨率的RAW格式图像,对图像进行中值滤波处理,并将滤波后的图像保存为新的RAW文件。

程序架构

代码说明 :

  1. 输入输出:
    ◦ 输入为RAW格式图像文件,分辨率为7680x4320,位深为16位
    (有效位深为12位,即饱和值为4095)。
    ◦ 输出为中值滤波后的RAW文件,保存为16位位深。
  2. 中值滤波逻辑:
    ◦ 使用MATLAB的medfilt2函数对图像进行中值滤波。
    ◦ filter_size参数指定滤波窗口的大小(例如3表示3x3窗口)。
  3. 数据提取与恢复:
    ◦ 从16位数据中提取低12位有效数据。
    ◦ 滤波后,将12位数据恢复为16位数据,保存为RAW文件。

算法原理

中值滤波的原理
中值滤波的核心思想是用像素邻域内的中值代替当前像素的值。具体步骤如下:

  1. 定义一个滤波窗口(通常为3x3、5x5等奇数大小的窗口)。
  2. 将窗口内的所有像素值求平均。
  3. 取排序后的中间值(即中值)作为当前像素的新值。

中值滤波的数学表达式为:
在这里插入图片描述

其中,W 是滤波窗口,I(x,y)是窗口内的像素值,其中median 表示取中值操作。

中值滤波的特点

  1. 去噪能力:中值滤波对椒盐噪声(Salt-and-Pepper Noise)特别有效。椒盐噪声表现为图像中随机出现的黑白像素点,中值滤波可以很好地去除这种噪声。
  2. 边缘保护:中值滤波是一种非线性滤波方法,不会像均值滤波那样对图像进行平滑处理,因此能够更好地保留图像的边缘和细节。
  3. 计算复杂:中值滤波需要对窗口内的像素值进行排序,因此计算复杂度较高,尤其是对于大窗口和高分辨率图像。

代码实现

MATLAB代码实现如下:

clc;clear;tic;
% 图像中值滤波模块

median_filter_raw('Image1.raw', 'filtered_image.raw', 3);

function median_filter_raw(input_file, output_file, filter_size)
    % 参数说明:
    % input_file : 输入的RAW格式图像文件路径
    % output_file: 输出的中值滤波后RAW文件路径
    % filter_size: 中值滤波的窗口大小(例如 3 表示 3x3 窗口)

    % 图像参数
    width           = 7680;             % 图像宽度
    height          = 4320;             % 图像高度
    bit_depth       = 16;               % 图像位深
    effective_bits  = 12;               % 有效位深

    % 打开RAW文件
    fid = fopen(input_file, 'rb');
    if fid == -1
        error('无法打开RAW文件');
    end

    % 读取RAW图像数据
    raw_data = fread(fid, [width, height], 'uint16'); % 读取为7680x4320的矩阵
    raw_data_s = transpose(raw_data);
    figure;subplot(1,2,1);imshow(raw_data_s,[0,4096]);title('Original Image');
    fclose(fid); 

    % 将图像数据转换为双精度类型以便处理
    raw_data = double(raw_data);

    % 对图像进行中值滤波
    filtered_data = medfilt2(raw_data, [filter_size, filter_size]);
    filtered_data_s = transpose(filtered_data);
    subplot(1,2,2);imshow(filtered_data_s,[0,4096]);title('Original Image');
    
    % 保存滤波后的图像为RAW文件
    fid = fopen(output_file, 'wb');
    if fid == -1
        error('无法创建输出文件');
    end
    fwrite(fid, filtered_data, 'uint16');
    fclose(fid);
 
    % 输出完成信息
    fprintf('中值滤波完成!滤波后的图像已保存到 %s\n', output_file);
end

输出的图像处理前后对比示例:

可以看到图像左侧天空和楼体上的噪点处理成功。
在这里插入图片描述
处理后的图像整体变得平滑。
在这里插入图片描述
但处理后的图像锐度有所下降,线条不再锐利清晰,需要后续锐化算法进一步优化。
在这里插入图片描述

注意事项

  1. RAW文件格式:

    ◦ 确保输入的RAW文件是7680x4320分辨率,16位位深,且数据按行优先存储。

    ◦ 如果RAW文件格式不同,需要调整读取方式。

  2. 滤波窗口大小:

    ◦ filter_size参数应为奇数(如3、5、7等),表示滤波窗口的大小。

  3. 性能优化:

    ◦ 对于7680x4320的高分辨率图像,中值滤波可能较慢。可以考虑使用MATLAB的并行计算功能(如parfor)优化性能。

  4. 文件路径:

    ◦ 确保输入和输出文件路径正确,避免文件读写错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值