WordCloud 制作詞云(4-2) --利用opencv來(lái)獲取輪廓圖

本節(jié)重點(diǎn)

實(shí)際情況下熔任,輪廓圖由于背景的干擾泽本,常常導(dǎo)致制作出的詞云往往輪廓不突出染突,致使詞云效果差捻爷。本節(jié)利用opencv中的前景提取函數(shù)grabCut(),來(lái)制作背景為白色的前景輪廓提取圖份企。
grabCut()有兩種模式:1. 認(rèn)為劃定邊界框也榄,邊界外部被認(rèn)定為背景(RECT模式);2. 手動(dòng)標(biāo)定背景與前景,依據(jù)標(biāo)定的內(nèi)容來(lái)提取(MASK模式)甜紫。

第一種模式來(lái)獲取前景:

這種模式下降宅,需要手動(dòng)單擊左鍵來(lái)框選前景區(qū)域。

# 利用矩形框來(lái)選中前景區(qū)囚霸,矩形外部為背景區(qū)域
import numpy as np
import cv2
from matplotlib import pyplot as plt
#獲取圖片
img = cv2.imread('zende.jpg')
mask = np.zeros(img.shape[:2],np.uint8)
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
#根據(jù)鼠標(biāo)事件來(lái)劃定邊界框
def drawRect(event,x,y,flags,param):
    global ix,iy,X,Y,W,H,img
#若鼠標(biāo)左鍵按下腰根,則記住當(dāng)前位置,邊界框的一個(gè)頂點(diǎn)
    if event==cv2.EVENT_LBUTTONDOWN:
        ix,iy=x,y
#拖動(dòng)的過(guò)程中拓型,對(duì)原圖的復(fù)制體畫(huà)矩形额嘿,img_temp表示臨時(shí)使用圖片
    elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
        img_temp=img.copy()
        cv2.rectangle(img_temp,(ix,iy),(x,y),(0,255,25),1)
        cv2.imshow('rect_test',img_temp)
#當(dāng)鼠標(biāo)左鍵釋放,則將當(dāng)前位置作為邊界框的另一個(gè)頂點(diǎn)
    elif event==cv2.EVENT_LBUTTONUP:
        X=min(ix,x)
        Y=min(iy,y)
        W=max(ix,x)-X
        H=max(iy,y)-Y
#使用grabCut()的RECT模式來(lái)提取前景
        cv2.grabCut(img,mask,(X,Y,W,H),bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)
        mask2 = np.where((mask==2)|(mask==0),0,1).astype('uint8')
        img=img*mask2[:,:,np.newaxis]
        img += 255*(1-cv2.cvtColor(mask2,cv2.COLOR_GRAY2BGR))
        cv2.imwrite('test_method1.jpg',img)
        cv2.imshow('rect_test',img)        

ix,iy,X,Y,W,H=[0]*6

cv2.namedWindow('rect_test')
cv2.setMouseCallback('rect_test',drawRect)
cv2.imshow('mask',mask)
cv2.imshow('rect_test',img)
cv2.waitKey(0)

cv2.destroyAllWindows()
處理效果:
(左)原圖 (右)RECT模式下提取結(jié)果
優(yōu)點(diǎn):提取過(guò)程簡(jiǎn)單,整體效果不錯(cuò)劣挫,對(duì)人物頭發(fā)邊緣册养、裙角提取得到位;不足:人物:發(fā)帶的處理压固,人物外:蝴蝶球拦,月亮(不完整)等細(xì)節(jié)很容易就被判為背景,無(wú)法控制邓夕。
第二種模式來(lái)獲取前景:

這種模式下刘莹,需要畫(huà)出前景和背景阎毅,再依據(jù)效果來(lái)調(diào)整焚刚。

#利用掩模圖來(lái)實(shí)現(xiàn)前景區(qū)的提取
import numpy as np
import cv2

# mode來(lái)決定當(dāng)前畫(huà)前景還是背景,前景時(shí)畫(huà)筆為白色扇调,畫(huà)背景時(shí)畫(huà)筆為黑色矿咕,默認(rèn)畫(huà)筆為白色
mode=True
#函數(shù)用來(lái)選定前景和背景,實(shí)質(zhì)是移動(dòng)鼠標(biāo)過(guò)程中畫(huà)圓
def drawCircle(event,x,y,flags,param):
    global img_temp,mask1
    if event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
        if mode:
            color_used=1
        else:
            color_used=0
        cv2.circle(img_temp,(x,y),5,(255*color_used,)*3,-1)
        cv2.circle(mask1,(x,y),3,color_used,-1)
        cv2.imshow('img',img_temp)
#         cv2.imshow('draw_test',mask1)

cv2.namedWindow('img')
img = cv2.imread('zende.jpg')
img_temp=img.copy()
bgdModel = np.zeros((1,65),np.float64)
fgdModel = np.zeros((1,65),np.float64)
mask1=3*np.ones(img.shape[:2],np.uint8)

cv2.setMouseCallback('img',drawCircle)
cv2.imshow('img',img)
#cv2.imshow('draw_test',mask1)

# 按下'm'鍵表示切換畫(huà)筆模式狼钮,按下'q'鍵退出碳柱,按下'o'鍵表示選定完畢開(kāi)始提取
while(1):
    k=cv2.waitKey(0)& 0xFF
    if k==ord('m'):
        mode=not mode
    elif k==ord('q'):
        break
    elif k==ord('o'):
        cv2.grabCut(img,mask1,None,bgdModel,fgdModel,4,cv2.GC_INIT_WITH_MASK)
        mask2 = np.where((mask1==2)|(mask1==0),0,1).astype('uint8')
        img = img*mask2[:,:,np.newaxis]
        img += 255*(1-cv2.cvtColor(mask2,cv2.COLOR_GRAY2BGR))
        cv2.imwrite('test.jpg',img)
        cv2.imshow('img',img)  
        
cv2.destroyAllWindows()
處理效果:
處理過(guò)程(左) MASK模式下處理結(jié)果(右)
優(yōu)點(diǎn):可以自行選定圖像前景背景,更符合實(shí)際情況熬芜;缺點(diǎn):相對(duì)第一種模式要費(fèi)時(shí)一點(diǎn)莲镣,Saber臉部下方、發(fā)帶部分的細(xì)節(jié)處理還需要進(jìn)一步細(xì)分背景涎拉。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑞侮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼓拧,更是在濱河造成了極大的恐慌半火,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季俩,死亡現(xiàn)場(chǎng)離奇詭異钮糖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酌住,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)店归,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阎抒,“玉大人,你說(shuō)我怎么就攤上這事娱节∧域龋” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵肄满,是天一觀(guān)的道長(zhǎng)谴古。 經(jīng)常有香客問(wèn)我,道長(zhǎng)稠歉,這世上最難降的妖魔是什么掰担? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮怒炸,結(jié)果婚禮上带饱,老公的妹妹穿的比我還像新娘。我一直安慰自己阅羹,他們只是感情好勺疼,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著捏鱼,像睡著了一般执庐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上导梆,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天轨淌,我揣著相機(jī)與錄音,去河邊找鬼看尼。 笑死递鹉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藏斩。 我是一名探鬼主播躏结,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狰域!你這毒婦竟也來(lái)了媳拴?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤北专,失蹤者是張志新(化名)和其女友劉穎禀挫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拓颓,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡语婴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砰左。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡匿醒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缠导,到底是詐尸還是另有隱情廉羔,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布僻造,位于F島的核電站憋他,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏髓削。R本人自食惡果不足惜竹挡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望立膛。 院中可真熱鬧揪罕,春花似錦、人聲如沸宝泵。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)儿奶。三九已至框往,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間廓握,已是汗流浹背搅窿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工嘁酿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隙券,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓闹司,卻偏偏與公主長(zhǎng)得像娱仔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子游桩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容