加权中值滤波matlab
时间: 2023-09-09 17:13:04 浏览: 357
加权中值滤波是一种对图像进行平滑处理的滤波方法,它的基本思想是将图像中每个像素的灰度值替换成它周围像素灰度值排序后的中间值,同时加入权重因子来控制滤波效果。在MATLAB中实现加权中值滤波可以使用medfilt2函数。
具体步骤如下:
1. 定义加权中值滤波器的大小和权重系数。例如,可以定义一个3x3大小的加权中值滤波器,其中中心像素的权重为1,相邻像素的权重为0.5。
2. 读取需要进行加权中值滤波处理的图像。
3. 对每个像素进行处理,将其周围像素的灰度值排序后计算加权中值。
4. 将处理后的像素值写入输出图像。
MATLAB代码示例:
```matlab
% 定义加权中值滤波器的大小和权重系数
w = [0.5 1 0.5; 1 1 1; 0.5 1 0.5];
% 读取需要进行加权中值滤波处理的图像
img = imread('test.jpg');
% 对图像进行加权中值滤波处理
filtered_img = medfilt2(img, [3 3], 'indexed', w);
% 显示处理前后的图像
subplot(1, 2, 1), imshow(img), title('Original Image');
subplot(1, 2, 2), imshow(filtered_img), title('Filtered Image');
```
其中,medfilt2函数的第二个参数为加权中值滤波器的大小,'indexed'参数表示输入图像是索引图像,第四个参数为加权系数矩阵w。
相关问题
matlab实现加权中值滤波
加权中值滤波是一种常见的图像滤波算法,可以有效地去除图像中的噪声。它在中值滤波的基础上,加入了像素权重的概念,能够更好地保留图像的细节信息。
下面是使用Matlab实现加权中值滤波的示例代码:
```matlab
function img_filtered = weighted_median_filter(img, window_size, weights)
% img: 待滤波的图像
% window_size: 窗口大小(必须是奇数)
% weights: 每个像素的权重矩阵,大小和img相同
% 获取图像大小
[M, N] = size(img);
% 计算窗口半径
r = floor(window_size/2);
% 边缘填充
img_padded = padarray(img, [r, r], 'symmetric');
% 初始化滤波后的图像
img_filtered = zeros(M, N);
% 对每个像素进行滤波
for i = r+1:M+r
for j = r+1:N+r
% 获取当前窗口内的像素
window = img_padded(i-r:i+r, j-r:j+r);
% 将窗口内的像素按权重排序
[~, idx] = sort(window(:).*weights(:));
% 取中值
median_idx = ceil((window_size^2)/2);
img_filtered(i-r, j-r) = window(idx(median_idx));
end
end
```
使用示例:
```matlab
% 读取图像
img = imread('lena.bmp');
% 生成权重矩阵(这里随机生成)
weights = rand(size(img));
% 进行加权中值滤波
img_filtered = weighted_median_filter(img, 5, weights);
% 显示滤波前后的图像
figure;
subplot(121); imshow(img); title('原图');
subplot(122); imshow(img_filtered); title('滤波后');
```
注意:这里的权重矩阵是随机生成的,实际应用中需要根据具体情况来确定每个像素的权重。
自适应加权中值滤波算法matlab
自适应加权中值滤波算法(Adaptive Weighted Median Filter)是一种常用的非线性滤波算法,可用于去除高斯噪声、脉冲噪声等。
Matlab代码实现如下:
```matlab
function [output_img] = AWMedianFilter(input_img, max_window_size)
% 自适应加权中值滤波
% input_img: 输入图像
% max_window_size: 最大窗口尺寸
[m, n] = size(input_img);
output_img = zeros(m, n); % 输出图像
padding_size = floor(max_window_size/2);
for i = 1:m
for j = 1:n
cur_pixel = input_img(i,j); % 当前像素值
window_size = 3; % 窗口大小从3开始
while window_size <= max_window_size
padding = floor(window_size/2);
window = input_img(max(i-padding,1):min(i+padding,m), ...
max(j-padding,1):min(j+padding,n)); % 提取窗口
if cur_pixel > min(window(:)) && cur_pixel < max(window(:))
% 计算加权中值
sorted_window = sort(window(:));
center_pixel = sorted_window(padding+1);
left_window = sorted_window(1:padding);
right_window = sorted_window(padding+2:end);
left_weight = sum(center_pixel-left_window) / padding;
right_weight = sum(right_window-center_pixel) / padding;
output_img(i,j) = center_pixel + 0.5 * (left_weight - right_weight);
break; % 找到加权中值,跳出循环
else
window_size = window_size + 2; % 窗口大小加2
end
end
if window_size > max_window_size % 最大窗口尺寸内无法找到加权中值,取原像素值
output_img(i,j) = cur_pixel;
end
end
end
output_img = uint8(output_img); % 转为uint8类型
end
```
调用方法:
```matlab
input_img = imread('lena.png');
output_img = AWMedianFilter(input_img, 7);
imshow(input_img), title('原图');
figure, imshow(output_img), title('滤波后的图像');
```
阅读全文