Day21_魔術棒工具_magic_wand_tool.ipynb
花式修圖的這個系列...
主要會講的是一些比進階再更進階的內容,
會有比較多冷門的功能,或是更難的演算法。
今天要來介紹的是 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)
負向顏色差距最大值
正向顏色差距最大值
FLOODFILL_MASK_ONLY
: 設定則表示不改變原始圖片(等於忽略newVal的值),結果會改變在mask裡面FLOODFILL_FIXED_RANGE
: 設定這個表示考慮當前像素與種子點的差,沒有則代表都與鄰近的比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
的技巧,
快速得到我們人物的遮罩。
https://www.cnblogs.com/youmuchen/p/7450049.html
https://docs.opencv.org/master/d0/d86/tutorial_py_image_arithmetics.html
https://www.itread01.com/content/1537189082.html