成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用 Python 給你一個圣誕帽

開發 前端
在計算機中,圖像是以矩陣的形式保存的,先行后列。所以,一張寬×高×顏色通道=480×256×3的圖片會保存在一個256×480×3的三維張量中。圖像處理時也是按照這種思想進行計算的(其中就包括 OpenCV 下的圖像處理),即 高×寬×顏色通道。

圣誕將至,雖然咱不過這洋節,但是熱鬧還是要湊一下的,相信已經有很多圣誕帽相關的周邊在流傳了,今天咱們就自己動手,給頭像增加一個圣誕帽

基礎知識準備

在計算機中,圖像是以矩陣的形式保存的,先行后列。所以,一張寬×高×顏色通道=480×256×3的圖片會保存在一個256×480×3的三維張量中。圖像處理時也是按照這種思想進行計算的(其中就包括 OpenCV 下的圖像處理),即 高×寬×顏色通道。

數字圖像

對于一幅的數字圖像,我們看到的是 肉眼可見的一幅真正的圖片,但是計算機看來,這副圖像只是一堆亮度各異的點。一副尺寸為 M × N 的圖像可以用一個 M × N 的矩陣來表示,矩陣元素的值表示這個位置上的像素的亮度,一般來說像素值越大表示該點越亮。

一般來說,灰度圖用 2 維矩陣表示,彩色(多通道)圖像用 3 維矩陣(M× N × 3)表示。

圖像通道

描述一個像素點,如果是灰度,那么只需要一個數值來描述它,就是單通道。如果一個像素點,有RGB三種顏色來描述它,就是三通道。而四通道圖像,就是R、G、B加上一個A通道,表示透明度。一般叫做alpha通道,表示透明度。

ROI和mask

Setting Region of Interest (ROI),翻譯成白話為,設置感興趣的區域。mask是做圖像掩膜處理,相當于把我們不關心的部位覆蓋住,留下ROI部分。上面說的alpha就可以作為mask。

矩陣(Numpy)知識

矩陣索引、切片等,這里我自己掌握的也不好,就不多說了,小伙伴兒們可以自行學習。

環境準備

有了基礎知識后,我們來簡單看下代碼。

首先安裝需要要用到的 OpenCV? 和 dlib 庫,使用pip分別安裝之

pip install python-opencv

pip install dlib

然后手工在網上下載數據模型文件 shape_predictor_5_face_landmarks.dat,地址如下:http://dlib.net/files/,下載后放到項目目錄下。

有興趣的同學可以玩玩那個 shape_predictor_68_face_landmarks.dat,識別出的人臉關鍵點有68個之多呢。

圖片

代碼處理

帽子處理

我們首先要做的就是處理帽子,我們使用的圖片如下

圖片

先提取帽子圖片的rgb和alpha值

# 帽子圖片
hat_img3 = cv2.imread("hat.png", -1)
r, g, b, a = cv2.split(hat_img3)
rgb_hat = cv2.merge((r, g, b))
cv2.imwrite("rgb_hat.jpg", rgb_hat)
cv2.imwrite("alpha.jpg", a)
print(a)
print(hat_img3.shape)
print(rgb_hat.shape)

我們得到的效果如下:

rgb圖

圖片

alpha圖

圖片

對于的打印出的a數值如下:

[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]

人臉檢測

下面進行人臉檢測,使用dlib處理。

# 人臉檢測
dets = self.detector(img, 1)
x, y, w, h = dets[0].left(), dets[0].top(), dets[0].right() - dets[0].left(), dets[0].bottom() - dets[0].top()
# 關鍵點檢測
shape = self.predictor(img, dets[0])
point1 = shape.parts()[0]
point2 = shape.parts(2)
# 求兩點中心
eyes_center = ((point1.x + point2.x) // 2, (point1.y + point2.y) // 2)

接下來是按照比例縮小帽子的圖片

# 帽子和人臉轉換比例
hat_w = int(round(dets[0].right()/1.5))
hat_h = int(round(dets[0].bottom() / 2))
if hat_h > y:
hat_h = y - 1
hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h))
mask = cv2.resize(a, (hat_w, hat_h))
mask_inv = cv2.bitwise_not(mask)
dh = 0
dw = 0

bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]

ROI 提取

進行 ROI 提取

# 用alpha通道作為mask
mask = cv2.resize(a, (resized_hat_w, resized_hat_h))
mask_inv = cv2.bitwise_not(mask)

mask 變量,取出了帽子的區域。

圖片

mask_inv 變量,用來取出人臉圖片中安裝帽子的區域。

圖片

接下來在人臉圖片中取出安裝帽子的區域(ROI)

# 原圖ROI
# bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]
bg_roi = img[y + dh - resized_hat_h:y + dh,
(eyes_center[0] - resized_hat_w // 3):(eyes_center[0] + resized_hat_w // 3 * 2)]

再接下來在人臉圖片中取出帽子形狀區域

# 原圖ROI中提取放帽子的區域
bg_roi = bg_roi.astype(float)
mask_inv = cv2.merge((mask_inv, mask_inv, mask_inv))
alpha = mask_inv.astype(float) / 255
# 相乘之前保證兩者大小一致(可能會由于四舍五入原因不一致)
alpha = cv2.resize(alpha, (bg_roi.shape[1], bg_roi.shape[0]))
# print("alpha size: ",alpha.shape)
# print("bg_roi size: ",bg_roi.shape)
bg = cv2.multiply(alpha, bg_roi)
bg = bg.astype('uint8')

這里是把圖片默認的uint8?類型轉換成了float類型進行運算,最后又轉換回來。

合成的圖片

圖片

黑黑的部分就是我們要放置帽子的地方。

在帽子圖片中提取帽子部分。

# 提取帽子區域
hat = cv2.bitwise_and(resized_hat, resized_hat, mask=mask)

使用剛剛調整大小的帽子圖片來提取。

圖片

可以看到,除了帽子部分,其他區域已經掩模處理了。

以上就是提取ROI的過程,比較難懂,需要好好琢磨,尤其是矩陣的切片、mask處理部分。

合成圖片

最后一步就是把人臉圖片與帽子合成到一起了,也就是把人臉空余帽子部分的圖片區域和帽子只展示帽子區域的圖片區域(有點拗口)合并在一起。

# 相加之前保證兩者大小一致(可能會由于四舍五入原因不一致)
hat = cv2.resize(hat, (bg_roi.shape[1], bg_roi.shape[0]))
# 兩個ROI區域相加
add_hat = cv2.add(bg, hat)

效果如下:

圖片

剛剛好,完美疊加圖片。

最后把這個片段放回人臉原圖中,展示圖片

img[y+dh-hat_h:y+dh, (eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)] = add_hat

圖片

美美的圖片就出來啦!

我們再嘗試幾張不同的圖片。

圖片

圖片

整體效果還不錯哦,需要注意的是,在測試的時候,我們盡量選擇人臉占比比較大的圖片來合成,效果要好很多哦~

責任編輯:武曉燕 來源: 蘿卜大雜燴
相關推薦

2018-12-25 09:27:55

Python圣誕帽程序員

2017-12-26 09:10:43

Python微信圣誕帽

2018-07-03 15:20:36

Promise函數借錢

2021-09-12 17:23:57

canvas動畫函數

2019-12-24 11:03:17

Python數組圣誕節

2020-09-06 22:59:35

Linux文件命令

2023-01-30 16:21:24

Linux外觀

2019-08-14 16:56:38

Python職責模式請假

2021-08-04 17:55:38

keysRedis數據庫

2016-03-01 14:37:47

華為

2022-03-31 08:09:04

CSS繪制技巧時鐘

2018-10-31 10:11:24

Python編程語言語音播放

2024-04-03 15:20:08

2022-03-24 14:42:19

Python編程語言

2023-07-11 14:13:04

技術會談

2012-03-05 19:43:00

lumia

2013-10-12 09:24:44

Ubuntu 13.0Ubuntu 13.1

2020-09-15 13:56:08

公眾號機器人圖靈機器人

2018-08-26 05:38:44

路由器調制解調器網絡設備

2019-09-30 09:26:29

Java編程語言國旗
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久精品天堂 | 久久91精品 | 美女在线视频一区二区三区 | 久久综合久久久 | 久久久久亚洲精品 | 日本免费小视频 | 男女av| 日韩在线国产 | 精品国产91| 亚洲视频在线观看免费 | 日本三级精品 | 久久国产精品网站 | 91精品国产综合久久久久久丝袜 | 人人澡视频 | 一区在线观看 | 亚洲国产欧美精品 | 免费久久视频 | 国产精品久久国产精品99 | 中文字幕福利视频 | 国产精品视频久久久久久 | 在线国产一区二区 | 久久av一区二区三区 | 黄色综合| 久久免费精品 | 亚洲成人精品一区 | 中文在线а√在线8 | caoporn国产精品免费公开 | 综合久久99 | 激情福利视频 | 欧美在线 | 国产成人精品久久二区二区91 | 欧美成人一区二区 | 欧美视频精品 | 丁香久久 | www.日韩 | 国产免费一区二区三区网站免费 | 青青久草 | 伊人手机在线视频 | 日本韩国欧美在线观看 | 在线观看www高清视频 | 日韩免费高清视频 |