您的位置:

了解高斯滤波器

一、高斯滤波器基础知识


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)

高斯滤波器可以用于图像细化,即骨架化。在该例子中,我们通过对灰度化后的图像进行二值化操作,再对图像进行腐蚀、膨胀、减法等操作,最终得到图像的骨架。