項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 widget-area-1 尚未註冊或是沒有一個 view.php 檔案.
項目 search-input 尚未註冊或是沒有一個 view.php 檔案.

【OpenCV】21 – OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand Tool)

先來看看今天的結果圖

https://ithelp.ithome.com.tw/upload/images/20201003/20120424hmhfl6eFFu.png

-> 此篇文章的程式碼 github

Day21_魔術棒工具_magic_wand_tool.ipynb

前言

花式修圖的這個系列…
主要會講的是一些比進階再更進階的內容,
會有比較多冷門的功能,或是更難的演算法。

OpenCV 也有 photoshop 的魔術棒工具?!

今天要來介紹的是 OpenCV 中類似 photoshop 魔術棒工具的函數,
我們稱之為「漫水填充法」 cv2.floodFill

def floodfill(img, seed=(0, 0), loDiff=40, upDiff=30):
    copyimg = img.copy()
    h, w = img.shape[:2]
    mask = np.zeros([h+2, w+2], np.uint8) 
    cv2.floodFill(copyimg, mask, seed, (0, 0, 0), (loDiff, loDiff, loDiff), (upDiff, upDiff, upDiff), cv2.FLOODFILL_FIXED_RANGE)  

他的原理是從一個點的資訊出發,我們開始尋找鄰近點是否有與他相似的值,
如果有,則填充一樣的顏色,最後我們可以再利用此顏色進行其他修圖。

cv2.floodFill 的函數定義

cv2.floodFill(image, mask, seedPoint, newVal, loDiff, upDiff, flags)
  • image: 你的圖
  • mask: 遮罩,預設為「原圖的大小長寬各+2」
  • seedPoint: 種子點 (顏色對照點)
  • newVal: 要填充的顏色
  • loDiff: 與種子點顏色之負向顏色差距最大值
  • upDiff: 與種子點顏色之正向顏色差距最大值
  • flags: 可以分為
    • FLOODFILL_MASK_ONLY: 設定則表示不改變原始圖片(等於忽略newVal的值),結果會改變在mask裡面
    • FLOODFILL_FIXED_RANGE: 設定這個表示考慮當前像素與種子點的差,沒有則代表都與鄰近的比
    • 以上兩個參數可以用 or 相連表示同時使用: 即 FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE

「漫水填充法」 cv2.floodFill實作

又要來借用我自己的照片當示範一下啦…

原圖:

https://ithelp.ithome.com.tw/upload/images/20201003/20120424I8h5HiKBhH.png

填充後(此處用黃色來凸顯效果):

https://ithelp.ithome.com.tw/upload/images/20201003/201204242WAh3Wqxmk.png

當然這參數我有調過,實際上使用也需要自行調整參數以達到最佳效果。

用二值化濾出人物

img2gray = cv2.cvtColor(copyimg2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 1, 255, cv2.THRESH_BINARY)

https://ithelp.ithome.com.tw/upload/images/20201003/20120424Weo97Wq1kJ.png

https://ithelp.ithome.com.tw/upload/images/20201003/2012042411NaUUT8RA.png

其實操作很簡單,一開始填充值都設 黑色(0,0,0)
在二值化時,只需要將閥值設1 (1>0) 即可得到過濾出人物。

手動去掉不要的部分

roi = mask2[400:550, 950:w] # roi_y, roi_x
roi[np.where(roi > 254)] = 0
mask2[400:550, 950:w] = roi

https://ithelp.ithome.com.tw/upload/images/20201003/20120424TuAHYuFMEa.png

這部分沒辦法,就算用 photoshop 的魔術棒工具也是會有不完美的部分,
我們在針對區域去掉我們不要的地方。

得到最後乾淨的人物遮罩圖片

mask_inv = cv2.bitwise_not(mask2)

https://ithelp.ithome.com.tw/upload/images/20201003/20120424OhfpvRXI1Z.png

運用之前 cv2.bitwise_not的技巧,
快速得到我們人物的遮罩。


本文同步發佈在: 第 12 屆 iT 邦幫忙鐵人賽
【沒錢ps,我用OpenCV!】Day 21 – 花式修圖3,OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand