Scipy:運用 Sobel operator 計算圖像導數

運用 Sobel operator 計算圖像導數:

Sobel operator 如下所示,Sx 用於檢測水平的梯度變化,Sy 用於檢測垂直的梯度變化:

$$S_{x}=\begin{bmatrix} -1 & 0 & 1\\ -2 & 0 & 2\\ -1& 0 & 1 \end{bmatrix}$$ $$S_{y}=\begin{bmatrix} -1 & -2 & -1\\ 0 & 0 & 0\\ 1& 2 & 1 \end{bmatrix}$$

下面程式中的的 mag 為 dX 和 dY 的平方合開根號,代表梯度:

if __name__ == "__main__":
    import numpy as np
    from matplotlib import pyplot as plt
    from PIL import Image
    from scipy.ndimage import filters

    pli_img = Image.open("lena.jpg").convert("L")
    img = np.array(pli_img)
    plt.subplot(221)
    plt.title("original")
    plt.imshow(img, cmap="gray")
    
    imx = np.zeros (img.shape)
    # 1 for horizontal derivative
    filters.sobel(img, 1, imx)
    plt.subplot(222)
    plt.title("imx")
    plt.imshow(imx, cmap="gray")

    imy = np.zeros (img.shape)
    # 0 for vertical derivative
    filters.sobel(img, 0, imy)
    plt.subplot(223)
    plt.title("imy")
    plt.imshow(imx, cmap="gray")
    
    # magnitude
    mag = np.hypot(imx, imy)  
    # normalize
    mag *= 255.0 / np.max(mag)  
    plt.subplot(224)
    plt.title("edge")
    plt.imshow(mag, cmap="gray")
    
    plt.show()

留言

熱門文章