OpenCV python 学习笔记(九)

时间:2021-07-16 06:56:38
# -- coding:utf-8 --

"""
图像的平滑:
学习使用不同的低通滤波器对图像进行模糊
使用自定义的滤波器对图像进行卷积(2D 卷积)

2D 卷积:
我们可以对2D图像实施低通滤波(LPF)或者高通滤波(HPF)等。
LPF 帮助我们去除噪音,模糊图像。
HPF 帮助我们找到图像的边缘
OpenCV 提供的函数 cv.filter2D()可以让我们对一幅图像进行卷积操作
例如
我们对一幅图像使用平均滤波器。下面是一个 5x5 的平均滤波器核:
K =1/25*D (D是5*5的矩阵,且每一个元素都是1)
操作如下:
将核放在图像的一个像素A上,求与核对应的图像上25(5x5)个像素的和,
在取平均数,用这个平均数替代像素 A 的值。
重复以上操作直到将图像的每一个像素值都更新一边

双边滤波:
函数 cv2.bilateralFilter()能在保持边界清晰的情况下有效的去除噪音。
但是这种操作与其他滤波器相比会比较慢。
高斯滤波器是求中心点邻近区域像素的高斯加权平均值。
这种高斯滤波器只考虑像素之间的空间关系,而不会考虑像素值之间的关系(像素的相似度)。
所以这种方法不会考虑一个像素是否位于边界。因此边界也会别模糊掉,而这正不是我们想要。

双边滤波在同时使用空间高斯权重和灰度值相似性高斯权重。
空间高斯函数确保只有邻近区域的像素对中心点有影响,
灰度值相似性高斯函数确保只有与中心像素灰度值相近的才会被用来做模糊运算。
所以这种方法会确保边界不会被模糊掉,因为边界处的灰度值变化比较大。

"""

import cv2
import numpy as np

def showImg(img_list):
count = 0
for i in img_list:
cv2.imshow("res"+str(count), i)
count += 1
if cv2.waitKey(0) & 0xFF == 27:
cv2.destroyAllWindows()

def getImg(img_path):
# 我的是列图片太大了,写了这个函数将图片变小
a_img = cv2.imread(img_path)
return cv2.resize(a_img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_CUBIC)

# 2D卷积范例
img_path = "02.jpg"
img_2D = getImg(img_path)
img_show_list = [img_2D]
# k就是刚刚说的矩阵D,若是矩阵大了,图片就显得很亮,小了,就显得很暗,可以试试
k_size = 5
k = np.ones((k_size, k_size), np.float32)/25

dst = cv2.filter2D(img_2D, -1, k)

img_show_list.append(dst)
# cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)
# #d – Diameter of each pixel neighborhood that is used during filtering.
# If it is non-positive, it is computed from sigmaSpace
# 9 邻域直径,两个 75 分别是空间高斯函数标准差,灰度值相似性高斯函数标准差
img_blur = cv2.bilateralFilter(getImg(img_path), 9, 75, 75)

img_show_list.append(img_blur)
showImg(img_show_list)