最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

我會(huì)Python之后都不屑用PS了,Python摳圖太方便了!

2023-03-17 15:57 作者:下班被游戲打-  | 我要投稿


PS是大多數(shù)人都會(huì)實(shí)用的電腦p圖軟件,但是,在我學(xué)會(huì)了python之后,我發(fā)現(xiàn)代碼p圖實(shí)在是再方便不過了。

來看一下今天案例的素材:守望先鋒上的英雄,艾什的正面照

然后這是一張背景圖:


?


很簡(jiǎn)單,我要對(duì)第一張圖中的人物進(jìn)行摳圖,然后貼在背景圖上。

這個(gè)操作用PS并不復(fù)雜,讓我們來看一下這一過程如何用代碼來實(shí)現(xiàn)~

素材處理

對(duì)python爬蟲感興趣,想學(xué)習(xí),更多python入門資料,實(shí)操案例都會(huì)不定期分享給大家,喜歡python的,可以關(guān)注我哦。有整理的系統(tǒng)入門到項(xiàng)目的實(shí)戰(zhàn)資料,點(diǎn)擊我的主頁領(lǐng)取

首先,導(dǎo)入一些工具包

opencv(CV2),用于圖像處理


numpy,用于數(shù)據(jù)計(jì)算。


matplotlib用于出圖。

建立一個(gè)顯示圖片的函數(shù),便于在p圖過程中,實(shí)時(shí)查看效果

使用的是matplotlib功能

然后,導(dǎo)入前景圖。

因?yàn)閛pencv的圖片默認(rèn)使用BGR圖像格式,而我們通常使用的圖片是RGB(紅,綠,藍(lán)),所以,需要再轉(zhuǎn)換一下格式,否則查看時(shí)顏色會(huì)失真。

最后打印圖片規(guī)格和圖片本身

來看一下效果,高1054像素,長(zhǎng)703像素,3通道

同樣的方法,導(dǎo)入背景圖

back_img =?CV2.imread('back_img.jpg') #圖片導(dǎo)入

back_img =?CV2.cvtColor(back_img,CV2.COLOR_BGR2RGB) #轉(zhuǎn)換顏色模型

print(back_img.shape) #打印圖片規(guī)格

show(back_img) #顯示圖片

效果如下,高1079,長(zhǎng)1920,3通道。

我們發(fā)現(xiàn)人物圖高度和背景高度差不多,且我們只要中間的人像即可,那么我們先來適當(dāng)?shù)夭眉粢幌聢D片

裁剪圖片

img = img[0:1000,150:550] #裁剪圖片大小

show(img) #顯示圖片

通過切片,裁去了logo


?

再對(duì)圖片縮小10%,這樣大小最為合適

縮放圖片

print(img.shape) #打印圖片規(guī)格

img=CV2.resize(img,None,fx=0.9,fy=0.9) #圖片縮小10%

print(img.shape) #打印圖片規(guī)格

打印一下圖片尺寸,發(fā)現(xiàn)裁剪成功

?

圖片在計(jì)算機(jī)中是用數(shù)字矩陣形式保存的,紅、綠、藍(lán)三個(gè)顏色通道每種色各分為256階,分別由0-255這256個(gè)數(shù)表示。比如900*360的圖片,可以理解為900行360列的像素矩陣,而每個(gè)像素又是由R,G,B三個(gè)數(shù)字確認(rèn)其顏色的。于是,我們先把圖片的行,列數(shù)記錄下來,稍后可以用諸如遍歷的方法讀取每個(gè)像素,再對(duì)其進(jìn)行矩陣計(jì)算。


拆分圖片信息

rows,cols,channels = img.shape #拆分圖片信息

?



摳圖:三種效果


摳圖的方法雷同PS,我們要先建立個(gè)蒙版。在開始之前,我們先需要把圖片轉(zhuǎn)換成HSV格式,這是一種比較直觀的顏色模型,可以更好的數(shù)字化處理顏色。


轉(zhuǎn)換格式

img_hsv =?CV2.cvtColor(img,CV2.COLOR_RGB2HSV) #把圖片轉(zhuǎn)換成HSV格式,用于摳圖

show(img_hsv) #顯示圖片

看下效果:


?

雖然不能直視,但做法顯而易見,只要把非藍(lán)色的部分提取出來。我們?cè)O(shè)定一個(gè)閾值,在最小閾值以下和最大閾值以上,圖像變?yōu)?,而在閾值之間的變?yōu)?55。

摳圖

lower_blue=np.array([0,0,0]) #獲取最小閾值

upper_blue=np.array([0,255,255]) #獲取最大閾值

mask =?CV2.inRange(img_hsv, lower_blue, upper_blue) #創(chuàng)建遮罩

show(mask) #顯示遮罩

然后,遮罩就這么給整了出來。

?

不過,我們發(fā)現(xiàn),人物中間有那么多小點(diǎn)點(diǎn),我需要把它們?nèi)サ簟_@里使用形態(tài)學(xué)圖像處理的基本方法,先腐蝕后膨脹。其原理是在原圖的小區(qū)域內(nèi)取局部最小值和最大值,背后的邏輯為深度學(xué)習(xí)中的卷積神經(jīng)網(wǎng)絡(luò)。


通過嘗試,我發(fā)現(xiàn)還可以使用開運(yùn)算(先腐蝕后膨脹的整合運(yùn)算)直接完成這一過程,且效果相對(duì)較好。


erode=CV2.erode(mask,None,iterations=3) #圖像腐蝕

show(erode) #顯示圖片

dilate=CV2.dilate(erode,None,iterations=1) #圖像膨脹

show(dilate) #顯示圖片

opening =?CV2.morphologyEx(mask,?CV2.MORPH_OPEN,?CV2.getStructuringElement(CV2.MORPH_ELLIPSE, (8,8))) #開運(yùn)算

show(opening) #顯示圖片

大家可以自行比較下腐蝕,腐蝕后膨脹和開運(yùn)算的效果:



圖像合并


最后,終于到了圖像合并環(huán)節(jié)。先設(shè)定人物在背景圖中的起始位置。再遍歷遮罩中的每個(gè)像素,如果是0(代表黑色),則把人物圖像上的顏色賦值到背景圖像上。


center = [70,240] #設(shè)置前景圖開始位置

for i in range(rows):

?for j in range(cols):

?if opening[i,j]==0: #代表黑色

?back_img[center[0]+i,center[1]+j] =img[i,j] #賦值顏色

show(back_img) #顯示圖片

運(yùn)行完畢,顯示結(jié)果:

受限于圖片質(zhì)量和簡(jiǎn)化代碼,略顯粗糙,但大體已經(jīng)達(dá)到功能~

最后,調(diào)整圖片格式,并保存。


back_img =?CV2.cvtColor(back_img,CV2.COLOR_RGB2BGR) #圖像格式轉(zhuǎn)換

back_img=CV2.resize(back_img,None,fx=0.8,fy=0.8) #圖像縮放20%

CV2.imwrite('result.png',back_img) #保存圖像

今天的案例就結(jié)束啦,對(duì)python爬蟲感興趣,想學(xué)習(xí),更多python入門資料,實(shí)操案例都會(huì)不定期分享給大家,喜歡python的,可以關(guān)注我哦。有整理的系統(tǒng)入門到項(xiàng)目的實(shí)戰(zhàn)資料

獲取方式:點(diǎn)贊+評(píng)論資料

我會(huì)Python之后都不屑用PS了,Python摳圖太方便了!的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
横峰县| 凤台县| 靖州| 五指山市| 乐业县| 新邵县| 蒙城县| 宝清县| 扎鲁特旗| 定兴县| 固原市| 洛南县| 印江| 清远市| 云霄县| 太原市| 平凉市| 安平县| 酉阳| 攀枝花市| 金川县| 舟山市| 博乐市| 东乡县| 石柱| 定襄县| 阳朔县| 元江| 菏泽市| 枣强县| 广元市| 丰台区| 大余县| 图木舒克市| 佳木斯市| 察雅县| 高碑店市| 多伦县| 福建省| 威远县| 山阳县|