iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
1

大家好~~歡迎來到第十一篇介紹水果第二篇

imagepath = 'test_frult1.jpg'
img = cv2.imread(imagepath, 1)
gs_frame = cv2.GaussianBlur(img, (5, 5), 0,0)

#cv2.imshow("gs_frame",gs_frame)
#cv2.imwrite("Tomato_gs_frame.jpg",gs_frame)

hsv = cv2.cvtColor(gs_frame, cv2.COLOR_BGR2HSV)

#cv2.imshow("HSV", hsv)
#cv2.imwrite("Tomato_hsv.jpg", hsv)

erode_hsv = cv2.erode(hsv, None, iterations=2)
inRange_hsv = cv2.inRange(erode_hsv, color_dist[ball_color]['Lower'], color_dist[ball_color]['Upper'])

#cv2.imshow("inRange_hsv",inRange_hsv)
#cv2.imwrite("Tomato_inRange_hsv.jpg", inRange_hsv)

ret, thresh = cv2.threshold(inRange_hsv, 0, 255, cv2.THRESH_BINARY| cv2.THRESH_OTSU)

#cv2.imshow("thresh_1", thresh)
#cv2.imwrite("Tomato_final", img)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(5, 5))
first_try = cv2.erode(thresh, kernel, iterations=10)
cv2.imshow("first_try",first_try)

接下來我要介紹我在照片第一階段輸入的時候做的事情,首先呢,你要先利用 cv2.imread 進行讀取你的照片,那你的照片檔名以及格式都要自行輸入,我是都這樣撰寫,可能別人有不同的方式,而進來的資料

  • 要先做一次高斯模糊,讓他的輪廓可以明顯一些
  • 接著將她的顏色轉變一次,這時候注意我們要轉的就是 HSV 的顏色,所以要使用 HSV 的模塊來使用。
  • 轉換完之後我做了一次 erode 侵蝕一次,這裡的侵蝕我並沒有做得很深,因為範圍是用 2 代表侵蝕的作用很小。
  • 侵蝕完畢之後,我們就來取我們要的顏色,HSV 所呈現的都是鮮豔的色彩,所以這時候就可以把我們所定義的顏色範圍來做使用,利用 inRange 來取得我們要的範圍。
  • 取到之後我們將這些做好的前置作業來做一次 Threshold 方式來二值化。
  • 二值化完因為會看見圖形可能雜訊很高,所以我後面又做一次 erode 方式,但這裏大家可以看到我前面多做了一條 cv2.getStructuringElement,這個是定義參數的意思,我讓 kernal 就像一個正方形一樣擴開,然後給 erode 去使用這個範圍來做侵蝕,所以它的範圍就會做得很廣泛,不過也有缺點,可能會把自己要的圖形也吃進去了,所以這點要注意。
  • 最後我就利用 cv2.imshow 來做呈現。

這些流程看似複雜,其實都是只用幾個模組組成,但是這些小動作都能理解到不少東西,首先 iterations 這倒是蠻重要的部分,很多參考書或是參考資料幾乎都是固定用法,但是事實上,如果再做運算的時候,這裡是可以做改變來達到你自己的要求,但是大部分不建議改變利用固定的參數是因為他只要有稍微變動,你的圖形跟算法就會差很多,所以一般來說不建議這個東西一直做修改。

像我做番茄的時候,我不利用訓練方式用固定寫法,能辨識出所有番茄都有背景的情況下最多10:7,沒辦法在高,還是會有幾張沒辦法辨識出來,所以這個固定的寫法就是有壞處,沒有經過訓練是非常困難。

那麼這邊就講到這邊,我下一篇會講下半部做了甚麼樣的調整,先謝謝大家觀看,我們下篇見

嘗試,不是一件壞事,被綁在固定的框架中,不是很好的選擇,選擇自己自由的方式,比較重要。


上一篇
Day 10 水果-1
下一篇
Day 12 水果-3
系列文
AI的介紹-水果30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言