比PS還好用!Python 20行代碼批量摳圖

在日常的工作和生活中,我們經常會遇到需要摳圖的場景,即便是隻有一張圖片需要摳,也會摳得我們不耐煩,倘若遇到許多張圖片需要摳,這時候你的表情應該會很有趣。

Python能夠成為這樣的一種工具:在只有一張圖片,需要細緻地摳出人物的情況下,能幫你減少摳圖步驟;在有多張圖片需要摳的情況下,能直接幫你輸出這些人物的基本輪廓,雖然不夠細緻,但也夠用了。

比PS還好用!Python 20行代碼批量摳圖

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”即可(免費分享哦)希望能對你有所幫助


分享到:


相關文章: