您好,登錄后才能下訂單哦!
這篇“怎么用Python做一個圣誕帽”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“怎么用Python做一個圣誕帽”文章吧。
在計算機中,圖像是以矩陣的形式保存的,先行后列。所以,一張寬×高×顏色通道=480×256×3的圖片會保存在一個256×480×3的三維張量中。圖像處理時也是按照這種思想進行計算的(其中就包括 OpenCV 下的圖像處理),即 高×寬×顏色通道。
對于一幅的數字圖像,我們看到的是 肉眼可見的一幅真正的圖片,但是計算機看來,這副圖像只是一堆亮度各異的點。一副尺寸為 M × N 的圖像可以用一個 M × N 的矩陣來表示,矩陣元素的值表示這個位置上的像素的亮度,一般來說像素值越大表示該點越亮。
一般來說,灰度圖用 2 維矩陣表示,彩色(多通道)圖像用 3 維矩陣(M× N × 3)表示。
描述一個像素點,如果是灰度,那么只需要一個數值來描述它,就是單通道。如果一個像素點,有RGB三種顏色來描述它,就是三通道。而四通道圖像,就是R、G、B加上一個A通道,表示透明度。一般叫做alpha通道,表示透明度。
Setting Region of Interest (ROI),翻譯成白話為,設置感興趣的區域。mask是做圖像掩膜處理,相當于把我們不關心的部位覆蓋住,留下ROI部分。上面說的alpha就可以作為mask。
矩陣索引、切片等,這里我自己掌握的也不好,就不多說了,小伙伴兒們可以自行學習。
有了基礎知識后,我們來簡單看下代碼。
首先安裝需要要用到的 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 提取
# 用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
以上就是關于“怎么用Python做一個圣誕帽”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。