图片处理-opencv-2.图像平滑
2020-10-13 本文已影响0人
lk311
图像平滑
1.图像增强
图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、轮廓、对比度等,图像增强是进行强调或锐化,以便于显示、观察或进一步分析与处理。图像增强的方法是因应用不同而不同的,研究内容包括:
image.png
2.图像平滑
图像平滑是一种区域增强的算法,平滑算法有邻域平均法、中值滤波、边界保持类滤波等。在图像产生、传输和复制过程中,常常会因为多方面原因而被噪声干扰或出现数据丢失,降低了图像的质量(某一像素,如果它与周围像素点相比有明显的不同,则该点被噪声所感染)。这就需要对图像进行一定的增强处理以减小这些缺陷带来的影响。常用的算法均值滤波、方框滤波、高斯滤波和中值滤波
。
#为图像增加噪声
import cv2
import numpy as np
#读取图片
img = cv2.imread("data/test3.jpg", cv2.IMREAD_UNCHANGED)
rows, cols, chn = img.shape
#加噪声
for i in range(3000):
x = np.random.randint(0, rows)
y = np.random.randint(0, cols)
img[x,y,:] = 255
cv2.imshow("test3_noise", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("data/test3_noise.jpg", img)
1.均值滤波(简单局部平均)
均值滤波是指任意一点的像素值,都是周围N*M个像素值的均值
result = cv2.blur(原始图像,核大小)
- 核大小是以(宽度,高度)表示的元祖形式。常见的形式包括:核大小(3,3)和(5,5)
缺点:图像模糊
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
#均值滤波
result = cv2.blur(source, (5,5))
#显示图形
titles = ['Source Image', 'Blur Image']
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()
image.png
2.方框滤波(简单局部平均)
方框滤波和均值滤波核基本一致,区别是需不需要均一化处理
result = cv2.boxFilter(原始图像, 目标图像深度, 核大小, normalize属性)
- 目标图像深度是int类型,通常用“-1”表示与原始图像一致
- normalize属性表示是否对目标图像进行归一化处理。当normalize为false时,不进行均值化处理,实际上为求周围各像素的和,很容易溢出,溢出时均为白色,对应像素值为255。
缺点:图像模糊
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(15, 5))
#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#方框滤波
result_1 = cv2.boxFilter(source, -1, (5, 5), normalize=1)
result_0 = cv2.boxFilter(source, -1, (5, 5), normalize=0)
#显示图形
titles = ['Source Image', 'BoxFilter Image normalize=1', 'BoxFilter Image normalize=0']
images = [source, result_1, result_0]
for i in range(3):
plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
image.png
3.高斯滤波(邻域平均)
高斯平滑与简单平滑不同,它在对邻域内像素进行平均时,给予不同位置的像素不同的权值。高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值。
dst = cv2.GaussianBlur(src, ksize, sigmaX)
- src表示原始图像
- ksize表示核大小(N, N), N必须是奇数
- sigmaX表示X方向方差,主要控制权重
缺点:边界模糊
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
#读取图片
img = cv2.imread('data/test3_noise.jpg')
source = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#高斯滤波
result = cv2.GaussianBlur(source, (3,3), 0)
#显示图形
titles = ['Source Image', 'GaussianBlur Image']
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()
image.png
4.中值滤波(非线性)
中值滤波是非线性的图像处理方法,在去噪的同时可以兼顾到边界信息的保留。选一个含有奇数点的窗口W,将这个窗口在图像上扫描,把窗口中所含的像素点按灰度级的升或降序排列,取位于中间的灰度值来代替该点的灰度值。
dst = cv2.medianBlur(src, ksize)
- src表示源文件
- ksize表示核大小。核必须是大于1的奇数,如3、5、7等
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))
#读取图片
img = cv2.imread('data/test3_noise.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#中值滤波
result = cv2.medianBlur(img, 3)
#显示图形
titles = ['Source Image', 'medianBlur Image']
images = [img, 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()
image.png