数字图像处理(自适应中值滤波)

自适应中值滤波

常规的中值滤波在噪声密度不是很大的情况下(噪声出现的概率小于0.2时),性能很好,但是当概率较大时,常规的中值滤波处理完之后仍然存在噪声并且丢失了细节。自适应中值滤波器在进行滤波处理时,会根据某些条件来改变S的尺寸。滤波器输出的是一个数值,该数值用来表示(x,y)的像素值。

算法原理

算法的原理如书中p209中所示:
在这里插入图片描述
在这里插入图片描述
其中要使用到一个重要函数ordfilt2():
在这里插入图片描述

Matlab代码

clc;
clear;
f=imread('Kobe.jpg');
image_gray=rgb2gray(f);%得到灰度图像
ff =image_gray;
alreadyProcessed = false(size(image_gray));%生成逻辑非的矩阵
% 迭代.
Smax=7;
for k = 3:2:Smax
   zmin = ordfilt2(image_gray, 1, ones(k, k), 'symmetric');
   zmax = ordfilt2(image_gray, k * k, ones(k, k), 'symmetric');
   zmed = medfilt2(image_gray, [k k], 'symmetric');
   
   processUsingLevelB = (zmed > zmin) & (zmax > zmed) & ...
       ~alreadyProcessed; %需要转到B步骤的像素
   zB = (image_gray > zmin) & (zmax > image_gray);
   outputZxy  = processUsingLevelB & zB;%满足步骤AB的输出原值对应像素的位置
   outputZmed = processUsingLevelB & ~zB;%满足A不满足B的输出中值对应的像素位置
   ff(outputZxy) = image_gray(outputZxy);
   ff(outputZmed) = zmed(outputZmed);
   
   alreadyProcessed = alreadyProcessed | processUsingLevelB;
   if all(alreadyProcessed(:))
      break;
   end
end
ff(~alreadyProcessed) = zmed(~alreadyProcessed);
f1=imnoise(image_gray,'salt & pepper',0.3);%添加椒盐噪声后的图像
f2=medfilt2(f1,[3,3]);%中值滤波后的图像
subplot(2,2,1);
imshow(image_gray);
title('原图');
subplot(2,2,2);
imshow(f1);
title('椒盐噪声污染后的图像');
subplot(2,2,3);
imshow(f2);
title('中值滤波');
subplot(2,2,4);
imshow(ff);
title('自适应中值滤波');

实验效果展示

在这里插入图片描述

  • 10
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
1. 简介 自适应中值滤波是一种数字图像处理技术,用于去除噪声。该算法可以根据像素周围的灰度值来动态调整滤波器的大小,从而更好地保留图像细节。 本课程设计将介绍如何使用Python编写自适应中值滤波算法,并应用于图像处理。在本课程中,我们将使用Python的NumPy和OpenCV库来实现自适应中值滤波算法。 2. 实现步骤 2.1 加载图像 我们首先需要加载图像。在这个例子中,我们将使用OpenCV库中的imread()函数来加载图像。我们还将使用imwrite()函数保存处理后的图像。 ``` python import cv2 # 加载图像 img = cv2.imread('image.jpg') # 显示原始图像 cv2.imshow('Original Image', img) cv2.waitKey(0) # 保存原始图像 cv2.imwrite('original.jpg', img) ``` 2.2 自适应中值滤波算法 接下来,我们将实现自适应中值滤波算法。该算法包括以下步骤: - 对于每个像素,定义一个初始滤波器尺寸和最大滤波器尺寸。 - 对于每个像素,逐渐增加滤波器的尺寸,直到像素周围的灰度值在滤波器内的范围内。 - 如果滤波器的尺寸超过了最大滤波器尺寸,则将该像素的输出值设置为中值。 - 如果滤波器的尺寸仍在范围内,则计算滤波器内所有像素的中值,并将该值用于输出像素。 以下是自适应中值滤波算法的Python实现: ``` python import numpy as np def adaptive_median_filter(img, initial_size=3, max_size=7): # 获取图像宽度和高度 height, width = img.shape[:2] # 将输出图像初始化为零矩阵 output = np.zeros_like(img) # 遍历图像的每个像素 for y in range(height): for x in range(width): # 定义初始滤波器尺寸 size = initial_size # 定义滤波器内像素列表 pixels = [] # 循环直到找到合适的滤波器尺寸 while True: # 计算滤波器半径 radius = size // 2 # 获取滤波器内像素的坐标 xmin = max(0, x - radius) ymin = max(0, y - radius) xmax = min(width - 1, x + radius) ymax = min(height - 1, y + radius) # 将滤波器内的像素添加到列表中 for i in range(ymin, ymax + 1): for j in range(xmin, xmax + 1): pixels.append(img[i, j]) # 如果像素列表为空,则退出循环 if not pixels: break # 计算像素列表的中值 median = np.median(pixels) # 如果中值在滤波器内的范围内,则输出中值 if img[y, x] > min(pixels) and img[y, x] < max(pixels): output[y, x] = img[y, x] break # 如果当前滤波器尺寸大于等于最大滤波器尺寸,则输出中值 if size >= max_size: output[y, x] = median break # 增加滤波器尺寸并清空像素列表 size += 2 pixels = [] return output ``` 2.3 应用自适应中值滤波算法 我们现在可以将自适应中值滤波算法应用于图像处理。以下是应用算法的Python代码: ``` python # 应用自适应中值滤波算法 output = adaptive_median_filter(img) # 显示处理后的图像 cv2.imshow('Processed Image', output) cv2.waitKey(0) # 保存处理后的图像 cv2.imwrite('processed.jpg', output) ``` 3. 总结 在本课程设计中,我们介绍了如何使用Python编写自适应中值滤波算法,并应用于图像处理。我们使用了Python的NumPy和OpenCV库来实现算法,并给出了完整的Python代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值