图像平滑处理¶
1. 均值滤波¶
In [1]:
import cv2 #opencv的缩写为cv2
import matplotlib.pyplot as plt # matplotlib库用于绘图展示
import numpy as np # numpy数值计算工具包
# 魔法指令,直接展示图,Jupyter notebook特有
%matplotlib inline
img = cv2.imread('01_Picture/04_LenaNoise.png')
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
In [2]:
# 均值滤波
# 简单的平均卷积操作,方框中的值相加,取平均,替换掉中心204的值
blur = cv2.blur(img,(3,3)) # (3,3) 为核的大小,通常情况核都是奇数 3、5、7
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 方框滤波¶
In [3]:
# 方框滤波
# 基本和均值一样,可以选择归一化
# 在 Python 中 -1 表示自适应填充对应的值,这里的 -1 表示与颜色通道数自适应一样
box = cv2.boxFilter(img,-1,(3,3),normalize=True) # 方框滤波如果做归一化,得到的结果和均值滤波一模一样
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
In [4]:
# 方框滤波
# 基本和均值一样,可以选择归一化,容易越界
box = cv2.boxFilter(img,-1,(3,3),normalize=False) # 越界的值取 255
cv2.imshow('box',box)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 高斯滤波¶
In [5]:
# 高斯函数,越接近均值时,它的概率越大。
# 离中心值越近的,它的权重越大,离中心值越远的,它的权重越小。
aussian = cv2.GaussianBlur(img,(5,5),1)
cv2.imshow('aussian',aussian)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 中值滤波¶
In [6]:
# 中值滤波
# 排序后拿中值替代中间元素值的大小
median = cv2.medianBlur(img,5)
cv2.imshow('median',median)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 展示所有滤波¶
In [7]:
# 展示所有的
res = np.hstack((blur,aussian,median)) # 矩阵横着拼接
#res = np.vstack((blur,aussian,median)) # 矩阵竖着拼接
print(res)
cv2.imshow('median vs average', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
[[[125 137 226] [128 137 225] [129 137 224] ... [122 145 230] [110 130 221] [ 90 99 200]] [[125 137 226] [128 137 225] [129 137 224] ... [122 145 230] [110 130 221] [ 90 99 200]] [[125 137 226] [128 137 225] [129 137 224] ... [122 145 230] [110 130 221] [ 90 99 200]] ... [[ 81 47 103] [ 81 50 106] [ 60 25 90] ... [ 79 67 173] [ 79 67 174] [ 81 68 177]] [[ 80 47 102] [ 81 50 106] [ 74 26 90] ... [ 81 70 177] [ 81 70 177] [ 81 71 179]] [[ 57 22 82] [ 59 25 87] [ 75 27 90] ... [ 81 71 177] [ 81 71 179] [ 81 73 181]]]