图像非局部均值去噪matlab代码
时间: 2023-08-12 10:03:55 浏览: 65
【图像去噪】基于非局部欧几里德中值 (NLEM) 实现图像去噪附matlab代码.zip
以下是使用Matlab实现图像非局部均值去噪的代码:
```matlab
% 读取待去噪图像
I = imread('lena.png');
% 将图像转换为灰度图像
I = rgb2gray(I);
% 加入高斯噪声
sigma = 20;
J = imnoise(I, 'gaussian', 0, (sigma/255)^2);
% 设置非局部均值去噪参数
window_size = 7; % 滑动窗口大小
patch_size = 3; % 每个滑动窗口中的块大小
h = sigma; % 控制平滑程度的参数
% 非局部均值去噪
K = zeros(size(J));
for i = 1:size(J, 1)
for j = 1:size(J, 2)
% 获取当前滑动窗口及其坐标
row_min = max(1, i-window_size);
row_max = min(size(J, 1), i+window_size);
col_min = max(1, j-window_size);
col_max = min(size(J, 2), j+window_size);
patch = J(row_min:row_max, col_min:col_max);
patch_row = i-row_min+1;
patch_col = j-col_min+1;
% 获取当前块及其坐标
blk_row_min = max(1, patch_row-patch_size);
blk_row_max = min(window_size*2+1, patch_row+patch_size);
blk_col_min = max(1, patch_col-patch_size);
blk_col_max = min(window_size*2+1, patch_col+patch_size);
blk = patch(blk_row_min:blk_row_max, blk_col_min:blk_col_max);
% 计算相似度权重
w = exp(-(sum(sum((blk-J(i,j)).^2)))/(h^2));
% 计算加权平均值
K(i,j) = sum(sum(w.*patch(row_min:row_max, col_min:col_max)))/sum(sum(w));
end
end
% 显示去噪后的图像
figure, imshow(K, []);
title('Non-local Means Denoising');
```
上述代码中使用了一个嵌套的循环来对每个像素进行非局部均值去噪处理。具体来说,对于每个像素,先获取它所在的滑动窗口及其坐标,然后在滑动窗口中找到包含当前像素的块,计算该块与当前像素的相似度权重,最后根据相似度权重计算加权平均值并将其赋给当前像素。最终得到去噪后的图像K,并显示出来。
阅读全文