s1093345 作業2

 作業說明

  • 主題:線條自畫像(二值化與邊緣偵測 Image Thresholding and Edge Detection)
  • 撰寫一個程式,以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE)

    (a) 利用Sobel Operators 偵測並輸出邊緣成分圖。

    (b) 設計一個類似素描線條的自畫像圖案。



圖一、Input Image

開發環境

  • macOS 13.2.1
  • Visual Studio Code 1.56.2
  • Python 3.8.3
  • OpenCV 4.6.0

實作過程

  • 邊緣成分圖
    • 初始化設定
      • 透過 cv2.imread(‘path’) 讀取圖片位置,括號內放置圖片路‘path’
      • 使用 cv2.cvtColor() 、 cv2.COLOR_BGR2GRAY() 將原始圖片轉換為灰階圖片,如圖二。
圖二、灰階圖片
    • 高斯模糊函數
      • 使用cv2.GaussianBlur(img, (kernel_size, kernel_size), 0) 去噪、模糊化,img為輸入的原始圖片,kernel_size 3 x 3 計算,,kernel_size大會越模糊標準差為0。如圖三。
圖三、高斯模糊去噪圖片
      • 索伯算子(Sobel Operator)
        • 使用cv2.Sobel(imgdepthdxdykernel_size)分別計算x方向以及y方向的梯度。img為先前高斯模糊後的圖片,depth設值為cv2.CV_64,計算x方向梯度時dx1dy0,計算y方向梯度則反之,kernel_size設為3。
        • 使用 cv2.ConvertScaleAbs() 分別將x方向以及y方向的梯度img取絕對值,並轉回 unit8 的型別。如圖四、圖五。
        • 透過 cv2.addWeighted(img1alphaimg2betagamma) 分別將 方向以及 y 方向的梯度圖片img1, img2以自行設置的權重alpha, beta相加,即可獲得邊緣成分圖。 
    圖四、方向梯度取絕對值之圖片      
    圖五、y 方向梯度取絕對值之圖片      

    • 素描線條的自畫像
      • 呈上述步驟
      • 二值化(Threshold)
        • 透過  cv2.threshold(img67255cv2.THRESH_BINARY) 將高斯模糊後的圖片二值化,將像素值小於67的像素設置為0,否則設置為255。如圖六。
    圖六、二值化圖片
      • 相反色操作
        • 使用 cv2.bitwise_not(img) 將先前的 Sobel 後的圖片及二值化的圖片做not,即黑色轉白色,白色轉黑色。
        • 透過cv2.addWeighted(img1alphaimg2betagamma分別將上述cv2.bitwise_not() 過後的img1, img2以自行設置的權重alpha, beta相加,即可獲得素描圖

    執行結果

    • 邊緣成分圖

    o   圖片讀取:程式碼中的 cv2.imread(‘path’) 更改所需讀取圖片路徑。

    o   執行程式:python 1093345_hw2

    圖七、邊緣成分圖之輸出結果
    • 素描線條的自畫像

    o   圖片讀取:程式碼中的 cv2.imread(‘path’) 更改所需讀取圖片路徑。

    o   執行程式:python 1093345_hw2


    圖八、素描線條自畫像之輸出結果

    影片Demo


    影片、程式Demo







    留言

    這個網誌中的熱門文章

    rzwang Homework #1

    s1093350 Homework #2

    s1081444 Homework #7