一、高斯滤波器基础知识
def gaussian_filter(sigma, kernel_size):
# 创建高斯核
kernel = np.zeros([kernel_size, kernel_size])
center = kernel_size // 2
for i in range(kernel_size):
for j in range(kernel_size):
x, y = i - center, j - center
# 计算高斯公式
kernel[i, j] = np.exp(-(x ** 2 + y ** 2) / (2 * sigma ** 2))
kernel_sum = np.sum(kernel)
# 将核归一化
kernel /= kernel_sum
return kernel
高斯滤波器(Gaussian Filter)是一种用于模糊图像的线性滤波器。它可以迅速去除图像中的噪点,同时使图像变得更加平滑。高斯滤波器的运算利用了高斯函数作为权重,将像素周围的值进行加权平均,具有平滑的效果。
高斯滤波器的主要参数是sigma和kernel_size。sigma表示高斯函数的标准差,kernel_size则表示滤波器的大小。之所以要使用高斯滤波器,是因为它在平滑图像时可以达到相对较好的效果,同时运算速度也较快。
二、高斯滤波器的应用
高斯滤波器广泛应用于计算机视觉领域。在图像识别、目标检测、分割等任务中,它能够极大地提升图像的质量和处理速度。下面介绍高斯滤波器在图像处理中的几个具体应用。
三、图像去噪
import cv2
img = cv2.imread("test.jpg")
sigma = 5
kernel_size = 19
# 高斯滤波
blurred = cv2.GaussianBlur(img, (kernel_size, kernel_size), sigma)
cv2.imshow("Original image", img)
cv2.imshow("Blurred image", blurred)
cv2.waitKey(0)
高斯滤波器可以用于去除图像中的大部分噪点。在这个例子中,使用OpenCV库中的GaussianBlur函数对图片进行高斯滤波,sigma和kernel_size均为超参数,用于确定滤波器的效果。
四、图像边缘检测
def convolve(image, kernel):
# 图像矩阵、核矩阵的行列数
image_row, image_col = image.shape
kernel_row, kernel_col = kernel.shape
# 计算 padding 大小
pad = (kernel_row - 1) // 2
# 定义一张新的图像
new_image = np.zeros(image.shape)
# 将图像填充
padded_image = np.zeros((image_row + pad * 2, image_col + pad * 2))
padded_image[pad:padding_row + pad, pad:image_col + pad] = image
# 卷积操作
for i in range(image_row):
for j in range(image_col):
new_image[i, j] = np.sum(kernel * padded_image[i:i + kernel_row, j:j + kernel_col])
return new_image
image = cv2.imread("edge.jpg")
sigma = 5
kernel_size = 19
# 创建高斯滤波器
kernel = gaussian_filter(sigma, kernel_size)
# 图像卷积得到滤波结果
blurred = convolve(image, kernel)
# 计算梯度值和方向
sobel_x = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
sobel_y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]])
gradient_x = convolve(blurred, sobel_x)
gradient_y = convolve(blurred, sobel_y)
gradient_magnitude = np.sqrt(np.square(gradient_x) + np.square(gradient_y))
gradient_direction = np.arctan2(gradient_y, gradient_x)
cv2.imshow("Original image", image)
cv2.imshow("Blurred image", blurred)
cv2.imshow("X gradient", gradient_x)
cv2.imshow("Y gradient", gradient_y)
cv2.imshow("Gradient magnitude", gradient_magnitude)
cv2.imshow("Gradient direction", gradient_direction)
cv2.waitKey(0)
高斯滤波器可以用于图像边缘检测。在该例子中,使用GaussianFilter函数得到一张滤波后的图像。接着,使用卷积操作得到梯度值和方向,最终得到原图像中的边缘部分。
五、图像细化
import cv2
import numpy as np
# 定义邻域
neighborhood = np.array([
[1, 1, 1],
[1, 1, 1],
[1, 1, 1]
], np.uint8)
# 定义骨架化函数
def skeletonize(image):
# 记录细化轮廓
skeleton = np.zeros(image.shape, np.uint8)
# 定义开运算
open_image = cv2.morphologyEx(image, cv2.MORPH_OPEN, neighborhood)
while True:
# 定义不同次数的腐蚀操作
eroded = cv2.erode(image, neighborhood)
temp = cv2.dilate(eroded, neighborhood)
temp = cv2.subtract(image, temp)
skeleton = cv2.bitwise_or(skeleton, temp)
image = eroded.copy()
if cv2.countNonZero(image) == 0:
break
return skeleton
# 读取图像并转换成灰度图像
image = cv2.imread("skel.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 进行阈值分割
_, threshold_image = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# 对二值化图像进行腐蚀操作得到骨架
skeleton = skeletonize(threshold_image)
cv2.imshow("Original image", image)
cv2.imshow("Skeleton image", skeleton)
cv2.waitKey(0)
高斯滤波器可以用于图像细化,即骨架化。在该例子中,我们通过对灰度化后的图像进行二值化操作,再对图像进行腐蚀、膨胀、减法等操作,最终得到图像的骨架。