发布于2019-08-07 11:54 阅读(1909) 评论(0) 点赞(1) 收藏(4)
目录
图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强主要是一个主观过程,而图像复原大部分是一个客观过程。图像增强的方法是因应用不同而不同的,研究内容包括:
图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中指滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。
图像平滑 有均值滤波、方框滤波、中值滤波和高斯滤波等。下面将介绍常用的均值滤波、中值滤波和高斯滤波。
为了实验方便,首先给图像加一点噪声。
代码如下所示:
- # -*- 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)
运行结果如下图所示:
均值滤波是指任意一点的像素值,都是周围 个像素值的均值。例如下图中,红色点的像素值是其周围蓝色背景区域像素值之和除25,25=5
5 是蓝色区域的大小。
均值滤波详细的计算方法如下图所示:
其中55的矩阵称为核,针对原始图像内的像素点,采用核进行处理,得到结果图像,如下图所示:
提取 1/25 可以将核转换为如下形式:
Python调用OpenCV实现 均值滤波 的函数如下:
result = cv2.blur(原始图像,核大小)
其中,核大小是以(宽度,高度)表示的元组形式。常见的形式包括:核大小(3,3)和(5,5)。
![]()
(1) 核大小为 33
代码如下所示:
- # 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()
运行结果如下图所示:
(2) 核大小为 55
代码如下所示:
- # 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()
运行结果如下图所示:
(2) 核大小为 1010
代码如下所示:
- # 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()
运行结果如下图所示:
注:
1)随着核大小逐渐变大,会让图像变得更加模糊;
2)如果设置为核大小为(1,1),则结果就是原始图像。
在使用邻域平均法去噪的同时也使得边界变得模糊。而中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。计算过程如下图所示:
Python调用OpenCV实现 中值滤波 的函数如下:
OpenCV主要调用 medianBlur() 函数实现中值滤波。图像平滑里中值滤波的效果最好。
dst = cv2.medianBlur(src, ksize)
其中,参数:
src 表示源图像;
ksize 表示核大小。核必须是大于1的奇数,如3、5、7等。
(1)核大小为 33
代码如下所示:
- # 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()
运行结果如下图所示:
(2)核大小为 55
代码如下所示:
- # 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()
运行结果如下图所示:
(3)核大小为 77
代码如下所示:
- # 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()
运行结果如下图所示:
注:
1)随着核大小逐渐变大,会让图像变得更加模糊;
2)核必须是大于1的奇数,如3、5、7等;
3)在代码 dst = cv2.medianBlur(src, ksize) 中 填写核大小时,只需填写一个数即可,如3、5、7等,对比均值滤波函数用法。
为了克服简单局部平均法的弊端(图像模糊),目前已提出许多保持边缘、细节的局部平滑算法。它们的出发点都集中在如何选择邻域的大小、形状和方向、参数加平均及邻域各店的权重系数等。
图像高斯平滑也是邻域平均的思想对图像进行平滑的一种方法,在图像高斯平滑中,对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值,下图的所示的 33 和 5
5 邻域的高斯模板。
(1)核大小为 33
(1)核大小为 55
高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。如下图所示,中心位置权重最高为0.4。
Python中OpenCV主要调用 GaussianBlur() 函数,如下:
dst = cv2.GaussianBlur(src, ksize, sigmaX)
其中,参数:
src 表示原始图像;
ksize 表示核大小;
sigmaX 表示X方向方差。
注:核大小(N, N)必须是奇数,X方向方差主要控制权重。
1)核大小为 3
3
2)核大小为 5
5
(1)核大小为 33
代码如下所示:
-
- # 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()
运行结果如下图所示:
(2)核大小为 55
代码如下所示:
- # 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()
运行结果如下图所示:
注:
1)随着核大小逐渐变大,会让图像变得更加模糊;
2)核大小(N, N)必须是大于1的奇数,如3、5、7等;
[1] https://blog.csdn.net/Eastmount/article/details/82216380
作者:小乖乖
链接:https://www.pythonheidong.com/blog/article/10515/a4134e99c7cf03a4105f/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!