在日常的工作和生活中,我們經常會遇到需要摳圖的場景,即便是隻有一張圖片需要摳,也會摳得我們不耐煩,倘若遇到許多張圖片需要摳,這時候你的表情應該會很有趣。
Python能夠成為這樣的一種工具:在只有一張圖片,需要細緻地摳出人物的情況下,能幫你減少摳圖步驟;在有多張圖片需要摳的情況下,能直接幫你輸出這些人物的基本輪廓,雖然不夠細緻,但也夠用了。
DeepLabv3+ 是谷歌 DeepLab語義分割系列網絡的最新作 ,這個模型可以用於人像分割,支持任意大小的圖片輸入。如果我們自己來實現這個模型,那可能會非常麻煩,但是幸運的是,百度的paddle hub已經幫我們實現了,我們僅需要加載模型對圖像進行分割即可。
原理
首先要選定要抽取對象的區域,區域外的部分為背景
基於選定區域,grabCut循環處理前景內容
前景部分含有的背景(抽取對象外)部分,並不能很好處理。
代碼
import cv2
import numpy as np
fname = 'images/test1.jpg'
img = cv2.imread(fname)
rect = (275, 120, 170, 320)
mask = np.zeros(img.shape[:2], np.uint8)
bgModel = np.zeros((1,65), np.float64)
fgModel = np.zeros((1,65), np.float64)
cv2.grabCut(img, mask, rect, bgModel, fgModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype(np.uint8)
out = img * mask2[:, :, np.newaxis]
cv2.imshow('output', out)
cv2.waitKey()
選定區域的width, height, x, y等參數的確定比較麻煩,且對結果影響較大
當抽取不連續對象時,區域要包含所有對象
當grabCut不能很好區分對象時,需要人工標記前景/背景部分。這時需要用到cv2.GC_INIT_WITH_MASK參數
最後,小編想說:我是一名python開發工程師,
整理了一套最新的python系統學習教程,
想要這些資料的可以關注私信小編“01”即可(免費分享哦)希望能對你有所幫助
閱讀更多 Python程序員不動否 的文章