s1091536 作業2
1.題目說明:
撰寫一個程式,以灰階模式讀取一張圖像 imread(path,
IMREAD_GRAYSCALE)
(a)利用 Sobel
Operators 偵測並輸出邊緣成分圖
(b)設計一個類似素描線條的自畫像圖案。(想想:如何使用邊緣偵測所得到的點,結合
成看似素描筆畫出的線條?)
2.開發環境:
Language: python 3.8
Package: OpenCV 4.7.0
4.方法及實作:
(a)概念:
將圖像以灰階讀入
-------------------------------------------------------------------------------------------------------
接著用 Sobel Operator 偵測並輸出邊緣成分圖
-------------------------------------------------------------------------------------------------------
原本預計將圖像做Invert (img[row][col] = 255 - img[row][col]) 得到黑白轉轉圖像後,再做二值化處理。
接著選擇寫在同一個 function 裡,合併處理。
我將灰階值 110 作為分界,
大於110的視為白色,直接設定為150(灰色鉛筆色),
小於110的視為黑色,直接設定為 255(白色背景),
消除大部分內部線條,顯示輪廓,得到以下類素描圖像。
最後使用高思濾波將圖像模糊,使其更接近鉛筆素描。
(b)程式:
使用cvtColor將圖像以灰階讀入。
img =
cv2.cvtColor(img,
cv2.COLOR_BGR2GRAY)
使用Sobel Operator 偵測並輸出邊緣成分圖。
sobelX = cv2.Sobel(img, cv2.CV_64F, 1, 0)
sobelY =
cv2.Sobel(img, cv2.CV_64F, 0, 1)
sobelX =
np.uint8(np.absolute(sobelX))
sobelY = np.uint8(np.absolute(sobelY))
sobelCombined = cv2.bitwise_or(sobelX, sobelY)
Invert 的同時 將圖像進行二質化處理
(rows,cols) = img.shape
for i in range(rows):
for j in range(cols):
if img[i][j]>=110: # 255 white
img[i][j] = 150
else:
img[i][j] = 255
sketch = cv2.GaussianBlur(sketch, (3, 3), 0)
留言
張貼留言