数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)目录 1 图像增强 图像平滑 1 1 图像增强简介 1 2 图像平滑 2 均值滤波 3 中值滤波 4 高斯滤波参考资料 1 图像增强 图像平滑 1 1 图像增强简介图像增强是对图像进行处理 使其比原始图像更适合于特定的应用 它需要与实际应用相结合 对于图像的某些特征如边缘 轮廓 对比度等 图像增强是进行强调或锐化 以便于显示 观察或进一步分析与处理 图像增强主要是一

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

目录

1 图像增强——图像平滑

1.1 图像增强简介

1.2 图像平滑

2 均值滤波

3 中值滤波

4 高斯滤波

参考资料


1 图像增强——图像平滑

1.1 图像增强简介

图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强主要是一个主观过程,而图像复原大部分是一个客观过程。图像增强的方法是因应用不同而不同的,研究内容包括:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

 

1.2 图像平滑

图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。

图像平滑 有均值滤波、方框滤波、中值滤波和高斯滤波等。下面将介绍常用的均值滤波、中值滤波和高斯滤波。

为了实验方便,首先给图像加一点噪声

 

代码如下所示:

# -*- coding:utf-8 -*- import cv2 import numpy as np # 读取图片 img = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED) img_noise=img cv2.imshow("src", img) rows, cols, chn = img_noise.shape # 加噪声 for i in range(5000): x = np.random.randint(0, rows) y = np.random.randint(0, cols) img_noise[x, y, :] = 255 cv2.imshow("noise", img_noise) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows() #保存含噪声图像 cv2.imwrite("zxp_noise.jpg", img_noise) 

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 


 

2 均值滤波

均值滤波是指任意一点的像素值,都是周围 N \times M 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=5\times5 是蓝色区域的大小。

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

均值滤波详细的计算方法如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

其中5\times5的矩阵称为,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

提取 1/25 可以将核转换为如下形式:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

Python调用OpenCV实现 均值滤波 的函数如下:

result = cv2.blur(原始图像,核大小)
其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。

                                                                               K=\frac{1}{9}\times \left[ \begin{matrix} 1 & 1 & 1 \\ 1 & 1 & 1 \\ 1 & 1 & 1 \\ \end{matrix} \right]     

                                                                      K=\frac{1}{25}\times \left[ \begin{matrix} 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ \end{matrix} \right]

 

(1) 核大小为 3\times3

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 均值滤波 result = cv2.blur(source, (3, 3)) #可以更改核的大小 # 显示图形 titles = ['Source Image', 'Blur Image (3, 3)'] images = [source, result] for i in range(2): plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show() 

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

(2) 核大小为 5\times5

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 均值滤波 result = cv2.blur(source, (5, 5)) #可以更改核的大小 # 显示图形 titles = ['Source Image', 'Blur Image (5, 5)'] images = [source, result] for i in range(2): plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

 

(2) 核大小为 10\times10

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 均值滤波 result = cv2.blur(source, (10, 10)) #可以更改核的大小 # 显示图形 titles = ['Source Image', 'Blur Image (10, 10)'] images = [source, result] for i in range(2): plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

注:

1)随着核大小逐渐变大,会让图像变得更加模糊;

2)如果设置为核大小为(1,1),则结果就是原始图像。

 


 

3 中值滤波

在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

Python调用OpenCV实现 中值滤波 的函数如下:

OpenCV主要调用 medianBlur() 函数实现中值滤波。图像平滑里中值滤波的效果最好。

dst = cv2.medianBlur(src, ksize)

其中,参数:

src 表示源图像;

ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。

 

(1)核大小为 3\times3

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') # 中值滤波 result = cv2.medianBlur(img, 3)#可以更改核的大小 # 显示图像 cv2.imshow("source img", img) cv2.imshow("medianBlur", result) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

(2)核大小为 5\times5

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') # 中值滤波 result = cv2.medianBlur(img, 5) #可以更改核的大小 # 显示图像 cv2.imshow("source img", img) cv2.imshow("medianBlur", result) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows() 

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

(3)核大小为 7\times7

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') # 中值滤波 result = cv2.medianBlur(img, 7) #可以更改核的大小 # 显示图像 cv2.imshow("source img", img) cv2.imshow("medianBlur", result) # 等待显示 cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

注:

1)随着核大小逐渐变大,会让图像变得更加模糊;

2)核必须是大于1的奇数,如3、5、7等;

3)在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如3、5、7等,对比均值滤波函数用法。

 


 

4 高斯滤波

为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。

图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 3\times3 和 5\times5 邻域的高斯模板。

(1)核大小为 3\times3

                                                                 \frac{1}{16}\times \left[ \begin{matrix} 1 & 2 & 1 \\ 2 & 4 & 2 \\ 1 & 2 & 1 \\ \end{matrix} \right]=\left[ \begin{matrix} {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{4}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; \\ {}^{1}\!\!\diagup\!\!{}_{16}\; & {}^{1}\!\!\diagup\!\!{}_{8}\; & {}^{1}\!\!\diagup\!\!{}_{16}\; \\ \end{matrix} \right]

 

(1)核大小为 5\times5

                                                                          \frac{1}{273}\times \left[ \begin{matrix} 1 & 4 & 7 & 4 & 1 \\ 4 & 16 & 26 & 16 & 4 \\ 7 & 26 & 41 & 26 & 7 \\ 4 & 16 & 26 & 16 & 4 \\ 1 & 4 & 7 & 4 & 1 \\ \end{matrix} \right]

 

高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

Python中OpenCV主要调用 GaussianBlur() 函数,如下:

dst = cv2.GaussianBlur(src, ksize, sigmaX)

其中,参数:

src 表示原始图像;

ksize 表示核大小;

sigmaX 表示X方向方差。

:核大小(N, N)必须是奇数,X方向方差主要控制权重。

1)核大小为 3\times3

                                                                    K=\left[ \begin{matrix} 0.05 & 0.1 & 0.05 \\ 0.1 & 0.4 & 0.1 \\ 0.05 & 0.1 & 0.05 \\ \end{matrix} \right]

2)核大小为 5\times5

                                                                    K=\left[ \begin{matrix} 1 & 1 & 2 & 1 & 1 \\ 1 & 3 & 4 & 3 & 1 \\ 2 & 4 & 8 & 4 & 2 \\ 1 & 3 & 4 & 3 & 1 \\ 1 & 1 & 2 & 1 & 1 \\ \end{matrix} \right]

 

(1)核大小为 3\times3

代码如下所示:

 # encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 高斯滤波 result = cv2.GaussianBlur(source, (3, 3), 0) #可以更改核大小 # 显示图形 titles = ['Source Image', 'GaussianBlur Image (3, 3)'] images = [source, result] for i in range(2): plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

(2)核大小为 5\times5

代码如下所示:

# encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt # 读取图片 img = cv2.imread('zxp_noise.jpg') source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 高斯滤波 result = cv2.GaussianBlur(source, (5, 5), 0) #可以更改核大小 # 显示图形 titles = ['Source Image', 'GaussianBlur Image (5, 5)'] images = [source, result] for i in range(2): plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray') plt.title(titles[i]) plt.xticks([]), plt.yticks([]) plt.show()

 

运行结果如下图所示:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

 

注:

1)随着核大小逐渐变大,会让图像变得更加模糊;

2)核大小(N, N)必须是大于1的奇数,如3、5、7等;

 

 

参考资料

[1] https://blog.csdn.net/Eastmount/article/details/

[2] Python+OpenCV图像处理

 


 

如果觉得内容还不错的话,欢迎点赞、转发、收藏,还可以关注微信公众号、CSDN博客、知乎。
 

1. 微信公众号:

数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)

2. CSDN博客:https://xiongyiming.blog.csdn.net/

3. 知乎:https://www.zhihu.com/people/xiongyiming

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205381.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:09
下一篇 2026年3月19日 下午6:10


相关推荐

  • AWVS的简单使用

    AWVS的简单使用其实 AWVS 使用很简单 由于 AWVS11 x 及以上版本都是以网页的形式展示的 虽然说是英文的 不过没关系 我们完全可以用 网页翻译 插件直动翻译成中文 那样使用起来就简单多了 大家一看就能明白 1 启动 AWVS 以 AWVS11 x 为例子 windows R 输入 services msc 打开服务对话框 启动 Acunetix 与 AcunetixData 服务 单击右键启动一下即可 2 登录 AWVS 打开 https localhost 3443 输入用户名和密码 账

    2026年3月16日
    2
  • 源码:FastReport FMX 2022.1

    源码:FastReport FMX 2022.1适用于 macOS Linux 和 MicrosoftWin 的多平台报告生成器 与 EmbarcaderoR FMX 库 兼容 FastReportFM 多平台报告生成器报告生成器 FastReportFM 是第一个将商业智能集成到基于 EmbarcaderoF DelphiforMSW Linux 和 macOS 的软件中的多平台解决方案 现在您还可以为 macOS 用户创建业务应用程序

    2026年3月19日
    2
  • lvm扩容是否影响oracle,LVM实战案例之LVM扩容

    lvm扩容是否影响oracle,LVM实战案例之LVM扩容接上所写二、LVM扩容(本次扩容需要对pv,vg,lv等进行扩容)需求分析:/ora01需要扩容5G(1)查看所需扩容的/ora01的空间情况[root@db01test]#df-hFilesystemSizeUsedAvailUse%Mountedon/dev/sda345G4.4G…

    2022年6月20日
    42
  • D3.js + Canvas 绘制组织结构图

    D3.js + Canvas 绘制组织结构图

    2022年4月2日
    260
  • eclipse的svn切换账号_eclipse将项目和svn关联

    eclipse的svn切换账号_eclipse将项目和svn关联百度搜了下全都是不知道哪年的一篇博客被疯狂转载,删除缓存文件的。但是根本不顶用。直接上我的解决方案吧(来自stackoverflow)。

    2022年10月14日
    5
  • 爬虫系列,(3),达盖尔图片抓取

    爬虫系列,(3),达盖尔图片抓取importreimportrequestsfrombs4importBeautifulSoup#第一步得到代理defproxy():withopen(r’ip_proxies\有效ip.txt’,’r’,encoding=’utf-8′)asf:r=f.readlines()foripinr:…

    2022年6月24日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号