详解图像滤波原理

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

01

图像增强——图像平滑

1.1 图像增强简介

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

be7e105410b9f768e1f4b78ea6be0f82.png

1.2 图像平滑

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

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

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

代码如下所示:

1. # -*- coding:utf-8 -*-

2. import cv2

3. import numpy as np

4.  

5. # 读取图片

6. img = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)

7. img_noise=img

8.  

9. cv2.imshow("src", img)

10. 

11. rows, cols, chn = img_noise.shape

12. 

13. 

14. # 加噪声

15. for i in range(5000):

16.     x = np.random.randint(0, rows)

17.     y = np.random.randint(0, cols)

18.     img_noise[x, y, :] = 255

19.  

20. 

21. cv2.imshow("noise", img_noise)

22.  

23. # 等待显示

24. cv2.waitKey(0)

25. cv2.destroyAllWindows()

25. 

27. #保存含噪声图像

28. cv2.imwrite("zxp_noise.jpg", img_noise)

运行结果如下图所示:

18ae9f3d04711766f564496ce81146ec.png

02

均值滤波

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

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

042ecf34401a6951dae41964ec9a8e51.png

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

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

1f32b20616ac2a58c1571a593a5a0fe7.png

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

result = cv2.blur(原始图像,核大小)

其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。

c9c90d9c87b972ebdd181f271449b37d.png                                                                                

(1) 核大小为 33

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5.  

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

9.  

10. # 均值滤波

11. result = cv2.blur(source, (3, 3)) #可以更改核的大小

12.  

13. # 显示图形

14. titles = ['Source Image', 'Blur Image (3, 3)']

15. images = [source, result]

16. for i in range(2):

17.    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')

18.    plt.title(titles[i])

19.    plt.xticks([]), plt.yticks([])

20. plt.show()

运行结果如下图所示:

5bad3aab291abb67b7f31a9d52bd2fb5.png

(2) 核大小为 55

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5.  

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

9.  

10. # 均值滤波

11. result = cv2.blur(source, (5, 5)) #可以更改核的大小

12.  

13. # 显示图形

14. titles = ['Source Image', 'Blur Image (5, 5)']

15. images = [source, result]

16. for i in range(2):

17.     plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')

18.     plt.title(titles[i])

19.     plt.xticks([]), plt.yticks([])

20. plt.show()

运行结果如下图所示:

f0c03c637c2b0c3184eb9ecbcc2ce59d.png

(2) 核大小为 1010

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5.  

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

9. 

10. # 均值滤波

11. result = cv2.blur(source, (10, 10)) #可以更改核的大小

12.  

13. # 显示图形

14. titles = ['Source Image', 'Blur Image (10, 10)']

15. images = [source, result]

16. for i in range(2):

17.     plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')

18.    plt.title(titles[i])

19.    plt.xticks([]), plt.yticks([])

20. plt.show()

运行结果如下图所示:

7041615e17076802e3477fa528fc3e4c.png

注:

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

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

03

中值滤波

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

d9b1d89651cbb2ffd8bfba9167101a05.png

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

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

dst = cv2.medianBlur(src, ksize)

其中,参数:

src 表示源图像;

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

(1)核大小为 33

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5. 

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. 

9. # 中值滤波

10. result = cv2.medianBlur(img, 3)#可以更改核的大小

11. 

12. # 显示图像

13. cv2.imshow("source img", img)

14. cv2.imshow("medianBlur", result)

15.  

16. # 等待显示

17. cv2.waitKey(0)

18. cv2.destroyAllWindows() 

运行结果如下图所示:

1e7818b80790bcf6a4cb535d48139241.png

(2)核大小为 55

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5. 

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. 

9. # 中值滤波

10. result = cv2.medianBlur(img, 5) #可以更改核的大小

11. 

12. # 显示图像

13. cv2.imshow("source img", img)

14. cv2.imshow("medianBlur", result)

 15.

16. # 等待显示

17. cv2.waitKey(0)

18. cv2.destroyAllWindows()

运行结果如下图所示:

beec95742f1fe4761691dcc5564e74b6.png

(3)核大小为 77

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5. 

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. 

9. # 中值滤波

10. result = cv2.medianBlur(img, 7) #可以更改核的大小

11. 

12. # 显示图像

13. cv2.imshow("source img", img)

14. cv2.imshow("medianBlur", result)

15. 

16. # 等待显示

17. cv2.waitKey(0)

18. cv2.destroyAllWindows() 

运行结果如下图所示:

2a8f4ab9cce35a7d4040052f5ba56fd2.png

注:

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

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

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

04

高斯滤波

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

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

(1)核大小为 33

33e6384aa2707d1e5dede2f3cf005d06.png

(1)核大小为 55

2a832ca917784f9a4fa35c08df6b0459.png

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

88bf4acce14d0cb52ed0ed8202bf3f34.png

84674d8ba4868aea3b4284e1b08cfbaa.png

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

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

其中,参数:

src 表示原始图像;

ksize 表示核大小;

sigmaX 表示X方向方差。

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

1)核大小为 33

7e9a930dbbb616705484818eac72bbee.jpeg

2)核大小为 55

523da90ad3d0d7e80c0ed81adc5c9076.jpeg

(1)核大小为 33

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5. 

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

9.  

10. # 高斯滤波

11. result = cv2.GaussianBlur(source, (3, 3), 0) #可以更改核大小

12. 

13. # 显示图形

14. titles = ['Source Image', 'GaussianBlur Image (3, 3)']

15. images = [source, result]

16. for i in range(2):

17.    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')

18.    plt.title(titles[i])

19.    plt.xticks([]), plt.yticks([])

20. plt.show()

运行结果如下图所示:

8df772641a808e1de5400f012dc82154.png

(2)核大小为 55

代码如下所示:

1. # encoding:utf-8

2. import cv2

3. import numpy as np

4. import matplotlib.pyplot as plt

5. 

6. # 读取图片

7. img = cv2.imread('zxp_noise.jpg')

8. source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

9. 

10. # 高斯滤波

11. result = cv2.GaussianBlur(source, (5, 5), 0) #可以更改核大小

12. 

13. # 显示图形

14. titles = ['Source Image', 'GaussianBlur Image (5, 5)']

15. images = [source, result]

16. for i in range(2):

17.    plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')

18.    plt.title(titles[i])

19.    plt.xticks([]), plt.yticks([])

20. plt.show()

运行结果如下图所示:

78060edfec55a2c26f85f434b69d3e29.png

注:

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

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

 
 

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

 
 

31cbee14236fad492963abb43da49a03.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值