图像处理——模糊

文章目录[x]
  1. 1:前置知识
  2. 2:什么是模糊
  3. 3:模糊算子实战与效果展示
  4. 4:总结

大家好,我是Ace,这篇文章通过实例讲解如何通过卷积运算实现模糊。

前置知识

请查看图像处理——卷积 - Ace C Lee 个人网站一文学习卷积。

什么是模糊

一张有意义图片,我们会发现有很多边缘存在,边缘一般都表现为亮度值的突变,那模糊其实就是变换平缓,相邻像素之间亮度值差别不大。

对一张图片做模糊操作可以将它每个像素和周边像素的差值变小一些,就可以达到模糊的效果。

我们已经学过了卷积,那我们就可以利用自主构造的卷积核,实现像素和周围像素的加权平均。将像素与周围像素差值变小,即可实现模拟效果。

模糊算子实战与效果展示

让我们使用Python调用OpenCV实际模拟该过程:

import cv2 as cv
import numpy as np
import os

from cv_static_resource import test_image_filepath, test_image_output_dir


def blur_1(img):
    kernel = np.array(
        [
            [1, 1, 1],
            # 3x3邻域内权重相等
            [1, 1, 1],
            # 3x3邻域内权重相等
            [1, 1, 1],
        ]
    )
    kernel = kernel / np.sum(kernel)
    print(kernel)
    img = cv.filter2D(
        img,
        # 表示图像位深不变
        ddepth=-1,
        kernel=kernel,
    )
    return img


def blur_2(img):
    kernel = np.array(
        [
            [1, 2, 1],
            # 离中心像素越远
            [2, 4, 2],
            # 权重越小
            [1, 2, 1],
        ]
    )
    kernel = kernel / np.sum(kernel)
    print(kernel)
    img = cv.filter2D(
        img,
        # 表示图像位深不变
        ddepth=-1,
        kernel=kernel,
    )
    return img


def gaussian_kernel_2d(kernel_size=3, sigma=1.5):
    """
    return np.ndarray
    """
    gaussian_kernel_1d = cv.getGaussianKernel(kernel_size, sigma)
    return np.matmul(gaussian_kernel_1d, gaussian_kernel_1d.T)


def gaussian_blur(img):
    kernel = gaussian_kernel_2d()
    print(kernel)
    print(np.sum(kernel))
    img = cv.filter2D(
        img,
        # 表示图像位深不变
        ddepth=-1,
        kernel=kernel,
    )
    return img


if __name__ == "__main__":
    gray = cv.imread(test_image_filepath, flags=cv.IMREAD_GRAYSCALE)

    output_filename = "gray.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, gray)

    blur_1 = blur_1(gray)

    output_filename = "output_blur_1.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, blur_1)

    blur_2 = blur_2(gray)

    output_filename = "output_blur_2.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, blur_2)

    gau_blur = gaussian_blur(gray)

    output_filename = "output_gaussian.webp"
    output_filepath = os.path.join(test_image_output_dir, output_filename)
    cv.imwrite(output_filepath, gau_blur)

原图的灰度图如下:

blur_1:

blur_2:

gaussian:

我们可以发现,blur_2比blur_1和gaussian都要清晰,而gaussian又要更加清晰一些。

这是因为,在卷积核中,中心像素的权重决定了结果与其本身的相似程度,而周围的像素的权重越高,越容易将边缘模糊,与中心像素越远的像素权重越大,图像越容易模糊。因为自然中的信号一般都是连续变化的,距离中心像素越远的点,越容易与其有较大的差别。

使用卷积核进行模糊时,可以使用自定义的模糊核对图像进行模糊,可以对模糊的强度和效果进行控制。

总结

1.图像模糊即为让图像的变化更缓慢。

2.自定义模糊核可以对模糊的效果进行控制。

点赞

发表评论

昵称和uid可以选填一个,填邮箱必填(留言回复后将会发邮件给你)
tips:输入uid可以快速获得你的昵称和头像

8 + 16 =