s1091403 作業2
主題: 線條自畫像 (二值化與邊緣偵測 Image Thresholding and Edge Detection)
作業說明:
以灰階模式讀取一張圖像 imread(path, IMREAD_GRAYSCALE),
1.
利用 Sobel Operators 偵測並輸出邊緣成分圖
2.
設計一個類似素描線條的自畫像圖案
開發環境:
Windows10
Anaconda
3(22.9.0)
Spyder
5.4.1
Python 3.9
Opencv(4.7.0)
程式片段(程式碼截圖在readme中):
使用cv2.imread(file,cv2. cv2.IMREAD_GRAYSCALE)輸入灰階照片,其中cv2.IMREAD_GRAYSCALE能直接把照片轉換成灰階。在設定對應的函式回傳的圖片與顯示的視窗,顯示之後按任意鍵會消失。
首先是Sobel Operators的部分,會先使用cv2.morphologyEx()這個形態學函式進行開運算處理(cv2.MORPH_OPEN),先侵蝕再膨脹,去除雜訊(kernel=(3,3)),再使用Sobel函數獲得經過Sobel Operator處裡的結果(output),函式中第一個參數為要進行運算的圖片,第二個為圖片深度(-1表示使用與原圖相同的深度,目標圖片的深度必須大於等於原圖的深度),第三個以及第四個參數則是分別針對x軸與y軸抓取邊緣,第五第六則分別是運算區域大小與縮放比例常數,兩個都必須要是正奇數。再來則是利用cv2.threshold()進行二值化獲得目標圖片(output),其中如果大於127就等於255,小於127則等於0(cv2.THRESH_BINARY)。
接下來是製造出素描畫像效果的部分,我使用兩個變數,分別代表上一個函式取得的邊緣成分圖(f)與原來的圖片(o),先將圖片反白(invert_img,invert_oimg),再使用高斯模糊(cv2.GaussianBlur())獲得模糊後的圖像(blur_img),再來使用cv2.divide()將原圖與高斯模糊後的圖片相除(div_img),最後再用加權的方式(cv2.addWeighted())把圖片疊起來獲得目標圖片(output)。
Demo影片: https://youtu.be/Na7cqVndurQ
留言
張貼留言