iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 13
0
影片教學

用Django架構建置專屬的LINEBOT吧系列 第 13

[Day 13]用Django架構建置專屬的LINEBOT吧 - 輪廓(Contour)(I)

灰階處理及二值化目的

在上一篇有提到如何以LINEBOT接收圖片,
並且進行灰階處理與二值化後再回傳給user,
這麼做能夠產生什麼用途呢?

這邊跟大家介紹關於圖像邊緣特徵偵測的一個簡易方法,
即運用opencv的findContours(),抓取二值化後的圖片輪廓,

首先前情提要一下,在進行灰階處理及二值化的時候,
過程式由三通道的RGB彩色圖片先轉為單通道的灰階圖,
然後再以臨界值(threshold),將圖片轉為0(黑色)或255(白色)二值化的圖,
而二值化的臨界值,可以從以下參數做設定:

#這裡的127即為二值化的臨界值,127以上二值化為白色,不足則二值化為黑色
ret,binary=cv.threshold(gray,127,255,cv.THRESH_BINARY)

因此在二值化的過程中,可以調整此臨界值以取得圖片中不同黑白分布的圖片,
以下將團隊LOGO作為舉例:

https://ithelp.ithome.com.tw/upload/images/20200922/20121176qtZmBfMEmV.jpg

在上面的範例當中,羊的圖片就不見了,
原因是在灰階圖片當中,羊的灰階數值是大於127的,
若要將羊保留為圖片中黑色部分,則我們可將臨界值調整至200,

#將臨界值調整至200,以保留較淺色區域
ret,binary=cv.threshold(gray,200,255,cv.THRESH_BINARY)

https://ithelp.ithome.com.tw/upload/images/20200922/20121176lZbZ22JcOv.jpg

這樣一來羊就被保留住囉~

以二值化圖片描繪contours

當我們獲得一個二值化圖片之後,
可以透過這個圖片來描繪出畫面中黑白間隔所組成的輪廓,

#image_processing.py

#將二值化的圖片放到
contours,hierarchy = cv.findContours(binary,cv.RETR_LIST,cv.CHAIN_APPROX_SIMPLE)

#首先複製原圖
copy = img.copy()

#將輪廓描繪在複製圖上
copy = cv.drawContours(copy,contours,-1,(255,0,0),2)

#將複製圖存實體檔案
contour_image_path = './static/contour.png'
cv.imwrite(contour_image_path,copy)
return contour_image_path

透過findContours()獲得的contours,
是一個由好幾個contour組成的list,
每個contour則是由多個座標點組成,

而drawContours()則是將輪廓繪製出來的函數,
介紹一下當中的參數,
第一個是要當底圖的圖片,第二個是要繪出的輪廓集,
第三個參數代表的是指定要繪出輪廓集當中的第幾個輪廓,若-1則是代表全部,
第四個參數跟第五個參數,分別代表繪製輪廓的線條顏色(B,G,R)跟粗細,

由上圖將contours繪畫至複製的原圖上,
所呈現的畫面會是如此:

https://ithelp.ithome.com.tw/upload/images/20200923/20121176qW89mxUE9z.jpg

建立空白底圖描繪輪廓

如果只想要看輪廓的樣子,可以用numpy的ones建立一個空白圖片,

#image_process.py
import numpy 

#建立空白圖片
empty = np.ones(img.shape,dtype=np.uint8)*255

#將輪廓描繪在複製圖上
copy = cv.drawContours(empty,contours,-1,(255,0,0),2)

https://ithelp.ithome.com.tw/upload/images/20200926/20121176q6noh5fheS.jpg

這樣一來就能將contours套在各種底圖上囉,


上一篇
[Day 12]用Django架構建置專屬的LINEBOT吧 - 圖片處理(II)用LINE處理圖片
下一篇
[Day 14]用Django架構建置專屬的LINEBOT吧 - 輪廓(Contour)(II)
系列文
用Django架構建置專屬的LINEBOT吧30

尚未有邦友留言

立即登入留言