使用非局部均值滤波进行图像去噪的MATLAB程序
时间: 2024-02-20 09:01:46 浏览: 72
NLmeansfilter.m_非局部均值滤波_图像去噪_
5星 · 资源好评率100%
以下是使用MATLAB实现非局部均值滤波进行图像去噪的程序:
```matlab
% 读入图像
img = imread('lena.png');
% 添加高斯噪声
noise_img = imnoise(img, 'gaussian', 0, 0.01);
% 设置滤波器参数
window_size = 7; % 滑动窗口大小
search_window_size = 21; % 搜索窗口大小
h = 0.1; % 滤波器强度参数
% 对图像进行非局部均值滤波
denoised_img = nlmeansfilter(noise_img, window_size, search_window_size, h);
% 显示图像
subplot(1, 2, 1);
imshow(noise_img);
title('带噪声图像');
subplot(1, 2, 2);
imshow(denoised_img);
title('去噪后图像');
% 定义非局部均值滤波函数
function [output_img] = nlmeansfilter(input_img, window_size, search_window_size, h)
% 将图像转换为灰度图像
input_img = rgb2gray(input_img);
% 将图像类型转换为double
input_img = im2double(input_img);
% 获取图像大小
[rows, cols] = size(input_img);
% 计算滤波器半径
r = (window_size - 1) / 2;
% 计算搜索窗口半径
sr = (search_window_size - 1) / 2;
% 初始化输出图像
output_img = zeros(rows, cols);
% 遍历每个像素
for i = 1 : rows
for j = 1 : cols
% 计算当前像素的搜索窗口
search_window = input_img(max(i - sr, 1) : min(i + sr, rows), max(j - sr, 1) : min(j + sr, cols));
% 计算搜索窗口中每个像素与当前像素的相似度
W = exp(-(search_window - input_img(i, j)).^2 ./ h^2);
% 计算搜索窗口中每个像素的权值
W = W / sum(W(:));
% 计算输出图像中当前像素的值
output_img(i, j) = sum(W(:) .* search_window(:));
end
end
% 将输出图像类型转换为uint8
output_img = im2uint8(output_img);
end
```
该程序首先读入图像,然后添加高斯噪声。接下来,程序定义了非局部均值滤波函数,该函数可以对输入图像进行滤波。最后,程序调用非局部均值滤波函数对添加了高斯噪声的图像进行滤波,并将滤波结果显示出来。
阅读全文