• SMOOTHING (LOWPASS) SPATIAL FILTERS


    Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition).

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    

    FILTERS

    filters实际上就是通过一些特殊的kernel (w) 对图片进行如下操作:

    [g(x, y) = sum_{s=-a}^a sum_{t=-b}^b w(s, t) f(x+s, y+t), : x = 1,2,cdots, M, : y = 1, 2,cdots N. ]

    其中(w(s, t) in mathbb{R}^{m imes n}, m=2a+1, n = 2b+1).
    注: 注意到上面会出现(f(-1, -1))之类的未定义情况, 常见的处理方式是在图片周围加padding(分别为pad a, b), 比如补0或者镜像补.

    用卷积的目的是其特别的性质:

    1. (f * g = g * f);
    2. (f * (g * h) = (f * g) * h);
    3. (f * (g + h) = (f * g) + (g * h)).

    注: (f, g, h)应当形状一致 (或者每次卷积完同样进行padding).

    特别的, 如果

    [w = uv^T, ]

    [w * f = u * (v^T * f). ]

    可以显著降低计算量.

    Box Filter Kernels

    [w_{ij} = frac{1}{mn}, quad i=1,2,cdots, m, : j=1,2,cdots, n. ]

    img = cv2.imread("./pics/alphabeta.png")
    img.shape
    
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 由于是截图, 先转成灰度图
    plt.imshow(img, cmap='gray')
    

    image-20210614143243637

    # 或者等价地用 cv2.blur(img, (m, n))
    kernels = [np.ones((i, i)) / (i * i) for i in [3, 11, 21]]
    imgs_smoothed = [cv2.filter2D(img, -1, kernel) for kernel in kernels]
    fig, axes = plt.subplots(2, 2)
    axes[0, 0].imshow(img, cmap='gray')
    axes[0, 0].set_title("raw")
    axes[0, 1].imshow(imgs_smoothed[0], cmap="gray")
    axes[0, 1].set_title("3x3")
    axes[1, 0].imshow(imgs_smoothed[1], cmap="gray")
    axes[1, 0].set_title("11x11")
    axes[1, 1].imshow(imgs_smoothed[2], cmap="gray")
    axes[1, 1].set_title("21x21")
    plt.tight_layout()
    plt.show()
    

    image-20210614143312683

    Lowpass Gaussian Filter Kernels

    [w(s, t) = G(s, t) = K e^{-frac{s^2+t^2}{2sigma^2}}, ]

    高斯分布的特点是绝大部分集中于((-3sigma, +3sigma))之间, 故一般(w)的大小选择为((-6sigma, +6sigma)), 需要注意的是, (sigma)的选择和图片的大小息息相关.

    imgs_smoothed = [cv2.GaussianBlur(img, ksize=ksize, sigmaX=sigma) for (ksize, sigma) in [((5, 5), 1), ((21, 21), 3.5), ((43, 43), 7)]]
    fig, axes = plt.subplots(1, 4)
    axes[0].imshow(img, cmap='gray')
    axes[0].set_title("raw")
    axes[1].imshow(imgs_smoothed[0], cmap="gray")
    axes[1].set_title("5x5, 1")
    axes[2].imshow(imgs_smoothed[1], cmap="gray")
    axes[2].set_title("21x21, 3.5")
    axes[3].imshow(imgs_smoothed[2], cmap="gray")
    axes[3].set_title("43x43, 7")
    plt.tight_layout()
    plt.show()
    

    image-20210614145105794

    Order-Statistic (Nonlinear) Filters

    (g(x, y))((x, y))周围的点的一个某个顺序的值代替, 比如median.

    imgs_smoothed = [cv2.medianBlur(img, ksize=ksize) for ksize in [3, 7, 15]]
    fig, axes = plt.subplots(1, 4)
    axes[0].imshow(img, cmap='gray')
    axes[0].set_title("raw")
    axes[1].imshow(imgs_smoothed[0], cmap="gray")
    axes[1].set_title("3x3")
    axes[2].imshow(imgs_smoothed[1], cmap="gray")
    axes[2].set_title("7x7")
    axes[3].imshow(imgs_smoothed[2], cmap="gray")
    axes[3].set_title("15x15")
    plt.tight_layout()
    plt.show()
    

    image-20210614145546864

  • 相关阅读:
    textspan 转连接
    showDialog 必须Stateful
    SliverList , SliverFixedExtentList
    sliver
    [UWP]UIElement.Clip虽然残废,但它还可以这样玩
    [UWP]用Win2D和CompositionAPI实现文字的发光效果,并制作动画
    [UWP]用Win2D实现镂空文字
    [UWP]通过自定义XamlCompositionBrushBase实现图片平铺
    [UWP]使用Win2D的BorderEffect实现图片的平铺功能
    [UWP]使用CompositionAPI的翻转动画
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/14882486.html
Copyright © 2020-2023  润新知