教你如何用python把玩守望先鋒新英雄
本文約1500字,閱讀需要5分鐘
關鍵詞:Python P圖 OpenCV
本文講述了藉助Python語言和OpenCV工具庫完成一個簡單的P圖操作的過程~
作為一名視覺化工程師,如果只會使用PS,那麼你一定OUT了。在專注各種花式P圖多年,在學習PS,AI,PR,AE,XD……無數設計軟體之後,本人終於悟到了一門獨步江湖的絕技——“程式碼P圖”。
今天,我就把這門P圖界的無上秘籍,傳授給你!希望你在炫技(zuo si)的道路上越走越遠。
來看一下今天的素材:守望先鋒新上線的英雄——艾什的正面照:
然後這是一張背景圖:
今天的任務很簡單,我要對第一張圖中的人物進行摳圖,然後貼在背景圖上。
這個操作用PS並不複雜,讓我們來看一下這一過程如何用程式碼來實現~
▼
素材處理
首先,匯入一些工具包
opencv(cv2),用於影像處理
numpy,用於資料計算。
matplotlib用於出圖。
import cv2
import numpy as np
import matplotlib.pyplot as plt
建立一個顯示圖片的函式,便於在P圖過程中,實時檢視效果
使用的是matplotlib的功能,和製作圖表的過程一致。
#建立顯示圖片的函式
def show(image):
plt.imshow(image)
plt.axis('off')
plt.show()
然後,匯入前景圖。
因為opencv的圖片預設使用BGR影像格式,而我們通常使用的圖片是RGB(紅,綠,藍),所以,需要再轉換一下格式,否則檢視時顏色會失真。
最後列印圖片規格和圖片本身
#匯入前景圖
img=cv2.imread('img.png') #圖片匯入
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #轉換顏色模型
print(img.shape) #列印圖片規格
show(img) #顯示圖片
來看一下效果,高1054畫素,長703畫素,3通道。
同樣的方法,匯入背景圖
#匯入背景圖
back_img = cv2.imread('back_img.jpg') #圖片匯入
back_img = cv2.cvtColor(back_img,cv2.COLOR_BGR2RGB) #轉換顏色模型
print(back_img.shape) #列印圖片規格
show(back_img) #顯示圖片
效果如下,高1079,長1920,3通道。
我們發現人物圖高度和背景高度差不多,且我們只要中間的人像即可,那麼我們先來適當地裁剪一下圖片
#裁剪圖片
img = img[0:1000,150:550] #裁剪圖片大小
show(img) #顯示圖片
透過切片,裁去了logo
再對圖片縮小10%,這樣大小最為合適
#縮放圖片
print(img.shape) #列印圖片規格
img=cv2.resize(img,None,fx=0.9,fy=0.9) #圖片縮小10%
print(img.shape) #列印圖片規格
列印一下圖片尺寸,發現裁剪成功
圖片在計算機中是用數字矩陣形式儲存的,紅、綠、藍三個顏色通道每種色各分為256階,分別由0-255這256個數表示。比如900*360的圖片,可以理解為900行360列的畫素矩陣,而每個畫素又是由R,G,B三個數字確認其顏色的。於是,我們先把圖片的行,列數記錄下來,稍後可以用諸如遍歷的方法讀取每個畫素,再對其進行矩陣計算。
#拆分圖片資訊
rows,cols,channels = img.shape #拆分圖片資訊
▼
摳圖:三種效果
摳圖的方法雷同PS,我們要先建立個蒙版。在開始之前,我們先需要把圖片轉換成HSV格式,這是一種比較直觀的顏色模型,可以更好的數字化處理顏色。
#轉換格式
img_hsv = cv2.cvtColor(img,cv2.COLOR_RGB2HSV) #把圖片轉換成HSV格式,用於摳圖
show(img_hsv) #顯示圖片
看下效果:
雖然不能直視,但做法顯而易見,只要把非藍色的部分提取出來。我們設定一個閾值,在最小閾值以下和最大閾值以上,影像變為0,而在閾值之間的變為255。
#摳圖
lower_blue=np.array([0,0,0]) #獲取最小閾值
upper_blue=np.array([0,255,255]) #獲取最大閾值
mask = cv2.inRange(img_hsv, lower_blue, upper_blue) #建立遮罩
show(mask) #顯示遮罩
然後,遮罩就這麼給整了出來。
不過,我們發現,人物中間有那麼多小點點,我需要把它們去掉。這裡使用形態學影像處理的基本方法,先腐蝕後膨脹。其原理是在原圖的小區域內取區域性最小值和最大值,背後的邏輯為深度學習中的卷積神經網路。
透過嘗試,我發現還可以使用開運算(先腐蝕後膨脹的整合運算)直接完成這一過程,且效果相對較好。
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))) #開運算
show(opening) #顯示圖片
大家可以自行比較下腐蝕,腐蝕後膨脹和開運算的效果:
▼
影像合併
最後,終於到了影像合併環節。先設定人物在背景圖中的起始位置。再遍歷遮罩中的每個畫素,如果是0(代表黑色),則把人物影像上的顏色賦值到背景影像上。
center = [70,240] #設定前景圖開始位置
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) #顯示圖片
執行完畢,顯示結果:
受限於圖片質量和簡化程式碼,略顯粗糙,但大體已經達到功能~
最後,調整圖片格式,並儲存。
back_img = cv2.cvtColor(back_img,cv2.COLOR_RGB2BGR) #影像格式轉換
back_img=cv2.resize(back_img,None,fx=0.8,fy=0.8) #影像縮放20%
cv2.imwrite('result.png',back_img) #儲存影像
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31558017/viewspace-2222099/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 《守望先鋒》新英雄「西格瑪」的誕生故事
- 從《守望先鋒》談戰場英雄體系設計
- 守望先鋒 UI 庫UI
- 同是英雄射擊遊戲,《為戰而生》咋就剛不過《守望先鋒》?遊戲
- 正在陷入內容枯竭的《守望先鋒》
- 專訪《守望先鋒 2》開發團隊:英雄與故事的再度啟程(上)
- 專訪《守望先鋒 2》開發團隊:英雄與故事的再度啟程(下)
- 滿分的《守望先鋒》和FPS遊戲在新世代的迷茫遊戲
- 淺談《守望先鋒》中的 ECS 構架
- 從《守望先鋒》學習關於ECS的概述
- 《守望先鋒2》到底“2”在哪?一個更好的故事?
- 《守望先鋒》內購收入現已突破10億美元
- 從中毒到戒毒,守望先鋒的玩家怎麼了?
- 暴雪內部是怎樣看待《守望先鋒2》的?
- 簡析《守望先鋒》塑造玩法策略性的努力
- 《守望先鋒》遊戲總監 Jeff Kaplan 離開暴雪遊戲
- win10守望先鋒渲染丟失怎麼解決 win10守望先鋒您的渲染裝置已丟失如何找回Win10
- 任天堂:《荒野行動》《守望先鋒》10月登陸Switch
- 外媒:暴雪正開發《守望先鋒2》 還有《暗黑4》
- 暴雪宣佈《暗黑破壞神4》和《守望先鋒2》延期推出
- 騰雲先鋒招新啦!!
- 拳頭最新遊戲曝光:它到底像“守望先鋒”還是“CS:GO”?遊戲Go
- 慶祝《守望先鋒》四週年 198元暢玩版0元領
- 正面硬剛守望先鋒的大作,最後無人知曉地死去
- 《守望先鋒》中的末日鐵拳是怎麼摧毀玩家體驗的?
- Win10打守望老是掉網怎麼辦 win10玩守望先鋒總是掉網修復方法Win10
- 守望先鋒聯賽2020賽季籌備開戰,它會成就電競賽事的新歷史嗎?
- 以《守望先鋒》為例看遊戲音效如何幫助玩家獲取資訊遊戲
- 曾是《守望先鋒》首席概念設計師,他為什麼選擇加入天美?
- 《先鋒英雄》9月26日終極刪檔計費測試
- 不足4000元i3-8100配獨顯守望先鋒遊戲電腦配置推薦遊戲
- 2021 中國技術先鋒年度評選啟動,增加新銳技術先鋒企業榜
- 2019賽季《守望先鋒聯賽》頒獎季 上海龍之隊DDing榮獲職責之星
- 網易魔幻英雄戰術競技手遊《孤島先鋒》新資料片7月26日公測
- 築影分享:暴雪首席藝術家帶你瞭解《守望先鋒》的建築環境設計
- 續寫經典!《魔法門之英雄無敵:王朝》先鋒測試今日開啟
- 教你如何用python運算元據庫mysql!!PythonMySql
- 教你如何用Python追蹤快遞資訊!Python