参考文献:Python+OpenCV图像处理(一篇全)_E_vens-优快云博客_基于python的opencv图像处理
图像平滑是一种区域增强算法,对图像进行一定的增强处理以减小噪声等带来的影响。
1、均值滤波 cv2.blur(image,(k,k))
任一点的像素值,都是周围N*M个像素值的均值。
核越大,图像越模糊,核大小为(1,1)时,表示原图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('F:\\lovergos\\OpenCV\\Image\\0827.jpg') # 原图
img = cv2.resize(img,None,fx=0.2,fy=0.2) # 图片太大,将其缩小,可省略
# 均值滤波
img1 = cv2.blur(img,(1,1))
img2 = cv2.blur(img,(50,50))
img3 = cv2.blur(img,(100,100))
img_names = ['origin','(1,1)','(50,50)','(100,100)']
images = [img,img1,img2,img3]
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.title(img_names[i])
plt.xticks([])
plt.yticks([])
plt.show()
处理效果对比:
2、中值滤波 cv2.medianBlur(src,ksize)
该点周围的像素点(包括本身),按次序排列,取中位数作为点的像素值。
注意:核必须是奇数;核越大,图片越模糊;相比于均值滤波,cv2.medianBlur(src,ksize)中ksize只需要填写一个数字即可。
img = cv2.imread('F:\\lovergos\\OpenCV\\Image\\0827.jpg') # 原图
img = cv2.resize(img,None,fx=0.2,fy=0.2) # 图片太大,将其缩小,可省略
# 中值滤波
img1 = cv2.medianBlur(img,1)
img2 = cv2.medianBlur(img,45)
img3 = cv2.medianBlur(img,101)
img_names = ['origin','(1,1)','(45,45)','(101,101)']
images = [img,img1,img2,img3]
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.title(img_names[i])
plt.xticks([])
plt.yticks([])
plt.show()
处理效果对比:
3、高斯滤波 cv2.GassianBlur(src,ksize,sigmaX)
高斯平滑对图像进行平均时,不同位置的像素被赋予了不同的权重。高斯滤波让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重。sigmaX为x方向方差,主要用来控制权重。
首先对原图添加椒盐噪声:
def salt_noise(origin_img,num):
'''
:param origin_img: 原图
:param num: 添加噪声点的量
:return: noise_img
'''
height,width = origin_img.shape[0],origin_img.shape[1] # 获取高和宽的像素值
for i in range(num):
h = random.randint(0,height-1)
w = random.randint(0,width-1)
if random.randint(0,1) == 0:
origin_img[h,w] = 0
else:
origin_img[h,w] = 255
return origin_img
origin_img = cv2.imread('F:\\lovergos\\OpenCV\\Image\\0827.jpg') # 原图
origin_img = cv2.resize(origin_img,None,fx=0.2,fy=0.2)
img_noise = salt_noise(origin_img,100000)
添加噪声后的图像为:
采用不同的ksize及sigmax对噪声图像进行高斯平滑处理:
# 高斯平滑处理带噪声的图
img_gassian1 = cv2.GaussianBlur(img_noise,(5,5),0)
img_gassian2 = cv2.GaussianBlur(img_noise,(15,15),0)
img_gassian3 = cv2.GaussianBlur(img_noise,(5,5),10)
cv2.imshow('img_gassian1',img_gassian1)
cv2.imshow('img_gassian2',img_gassian2)
cv2.imshow('img_gassian3',img_gassian3)
cv2.waitKey(0)
# img_names = ['img_noise','img_gassian1','img_gassian2','img_gassian3']
# images = [img_noise,img_gassian1,img_gassian2,img_gassian3]
# for i in range(4):
# plt.subplot(2,2,i+1)
# plt.imshow(images[i],'gray')
# plt.title(img_names[i])
# plt.xticks([])
# plt.yticks([])
# plt.show()
处理效果: