先來看看今天的結果圖
-> 此篇文章的程式碼 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
實作
又要來借用我自己的照片當示範一下啦…
原圖:
填充後(此處用黃色來凸顯效果):
當然這參數我有調過,實際上使用也需要自行調整參數以達到最佳效果。
用二值化濾出人物
img2gray = cv2.cvtColor(copyimg2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 1, 255, cv2.THRESH_BINARY)
其實操作很簡單,一開始填充值都設 黑色(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
這部分沒辦法,就算用 photoshop 的魔術棒工具也是會有不完美的部分,
我們在針對區域去掉我們不要的地方。
得到最後乾淨的人物遮罩圖片
mask_inv = cv2.bitwise_not(mask2)
運用之前 cv2.bitwise_not
的技巧,
快速得到我們人物的遮罩。
本文同步發佈在: 第 12 屆 iT 邦幫忙鐵人賽
【沒錢ps,我用OpenCV!】Day 21 – 花式修圖3,OpenCV 也有 photoshop 的魔術棒工具?! 漫水填充法 cv2.floodFill (Magic Wand