首页
/
每日頭條
/
科技
/
python圖像濾鏡
python圖像濾鏡
更新时间:2025-12-14 01:35:05

作者: 派森醬

來源:python 技術

随着聖誕節的到來,節日氣氛也越來越濃厚。大街上随處可見挂滿飾品的聖誕樹,好多小夥伴的頭上也多了一頂紅色牛角的聖誕帽。

往年在這個時候,好多 P圖軟件 會推出給頭像加一頂聖誕帽的功能,甚至有一年大夥 @微信官方 就可以在自己的微信頭像上加一頂聖誕帽。

作為一個學習 Python 的技術人,自己可以寫程序實現這個功能,做成一個軟件當然是一件很酷的事情了。

今天就給大家分享一下如何用 Python 制作一款自動給頭像添加聖誕帽的軟件。

如果不想看實現,可以直接跳到文末獲取軟件。

思路

我們的 頭像添加聖誕帽軟件 制作的大緻思路如下:

  • 要實現一個軟件,我們需要制作一個 GUI 界面,供用戶操作。
  • 要實現頭像戴聖誕帽功能,我們需要用戶上傳一張頭像,我們還需要準備一頂聖誕帽子圖片。
  • 要把聖誕帽戴在頭像上,我們需要識别頭像中的人臉和頭部特征,然後将帽子放在頭頂合成一張圖片。

基于以上思路,我們制作這款軟件的關鍵詞有:

  • GUI 界面
  • 聖誕帽圖片
  • 頭像圖片
  • 人臉識别
  • 打包軟件
實現

看了以上思路,相信大家腦海中已經對這個軟件制作的過程有了一個大緻的框架了。我們的實現主要分為:圖像制作、GUI界面、打包三大塊内容。

準備工作

首先列舉一下本次軟件制作過程中需要用的的一些包模塊:

  • cv2

pip install opencv-python

  • os

python 系統模塊

  • dlib

pip install dlib

  • numpy

pip install pandas

  • PySimpleGUI

pip install PySimpleGui

溫馨提示:這其中安裝 dlib 會遇到很多坑以及很多困難,一般需要一邊安裝一邊上網搜索報錯,從而找到解決辦法。保證安裝過一次之後不想嘗試第二次。

圖像制作準備聖誕帽

我們需要準備一個聖誕帽的圖片,格式最好為 png ,因為 png 圖片我們可以直接用 alpha通道 作為掩膜使用。如果是 jpg 圖片,需要先轉換成 png 格式圖片。注意這裡的轉換不是隻改個後綴名,那樣是行不通的。

我們用到的聖誕帽如下圖:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)1

為了能夠與 rgb 通道的頭像圖片進行運算,我們需要把聖誕帽圖像分離成 RGB 通道圖像和 alpha通道圖像:

r,g,b,a = cv2.split(hat_img) rgb_hat = cv2.merge((r,g,b)) cv2.imwrite("hat_alpha.jpg",a)

分離之後,得到的 alpha通道圖像如下所示:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)2

人臉識别

我從我的百寶箱中選擇了一張傻萌傻萌的圖片作為程序的測試圖片。

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)3

大家注意,因為我們要做人臉識别,然後自動添加帽子,所以選擇的圖片一定要是真人的正面照片,不然識别不了人臉,也就不知道在哪添加聖誕帽。

下面我們用 dlib 的正臉檢測器進行人臉檢測,用 dlib 提供的模型提取人臉的五個關鍵點。代碼如下:

# dlib人臉關鍵點檢測器 predictor_path = "shape_predictor_5_face_landmarks.dat" predictor = dlib.shape_predictor(predictor_path) # dlib正臉檢測器 detector = dlib.get_frontal_face_detector() # 正臉檢測 dets = detector(img, 1) # 如果檢測到人臉 if len(dets)>0: for d in dets: x,y,w,h = d.left(),d.top(), d.right()-d.left(), d.bottom()-d.top() # x,y,w,h = faceRect cv2.rectangle(img,(x,y),(x w,y h),(255,0,0),2,8,0) # 關鍵點檢測,5個關鍵點 shape = predictor(img, d) for point in shape.parts(): cv2.circle(img,(point.x,point.y),3,color=(0,255,0)) cv2.imshow("image",img) cv2.waitKey()

我們把圖片打印出來的效果是這樣的:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)4

看到這個圖片是不是有點熟悉,網上好多人臉識别的圖片都是這樣的。

調整帽子大小

我們選取兩個眼角的點,求中心作為放置帽子的x方向的參考坐标,y 方向的坐标用人臉框上線的 y 坐标表示。

然後我們根據人臉檢測得到的人臉的大小調整帽子的大小,使得帽子大小合适。

看到這裡,你應該明白,我們頭像的圖片中人的臉越正面那麼我們制作出來的效果越好。

# 選取左右眼眼角的點 point1 = shape.part(0) point2 = shape.part(2) # 求兩點中心 eyes_center = ((point1.x point2.x)//2,(point1.y point2.y)//2) # 根據人臉大小調整帽子大小 factor = 1.5 resized_hat_h = int(round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor)) resized_hat_w = int(round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor)) if resized_hat_h > y: resized_hat_h = y-1 # 根據人臉大小調整帽子大小 resized_hat = cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))

帽子區域處理

我們先将帽子的 alpha通道 作為 mask掩膜:

mask = cv2.resize(a,(resized_hat_w,resized_hat_h)) mask_inv = cv2.bitwise_not(mask)

接着,從人像圖中去除需要添加帽子的區域:

# 帽子相對與人臉框上線的偏移量 dh = 0 dw = 0 # 原圖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')

提取後的效果圖如下:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)5

接下來,我們提取聖誕帽的區域:

hat = cv2.bitwise_and(resized_hat,resized_hat,mask = mask)

提取後的效果圖如下:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)6

蓋帽

圖像處理的最後一步是蓋帽了,就是把提取的聖誕帽區域和圖片中提取的區域相加,然後再放到原圖中去。這裡需要注意的就是,相加之前resize一下保證兩者大小一緻

# 相加之前保證兩者大小一緻(可能會由于四舍五入原因不一緻) hat = cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0])) # 兩個ROI區域相加 add_hat = cv2.add(bg,hat) # cv2.imshow("add_hat",add_hat) # 把添加好帽子的區域放回原圖 img[y dh-resized_hat_h:y dh,(eyes_center[0]-resized_hat_w//3):(eyes_center[0] resized_hat_w//3*2)] = add_hat

最後,我們得到的效果圖如下:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)7

GUI界面

我們先來看效果圖:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)8

然後再來看這部分的實現代碼:

import PySimpleGUI as sg import os.path import cv2 file_list_column = [ [sg.Submit('生成', key='Go', size=(15, 1)), sg.Cancel('退出', key='Cancel', size=(15, 1))], [ sg.Text("圖片位置(選擇文件夾)"), sg.In(size=(25, 1), enable_events=True, key="-FOLDER-"), sg.FolderBrowse('浏覽'), ], [ sg.Listbox( values=[], enable_events=True, size=(40, 20), key="-FILE LIST-" ) ] ] image_viewer_column = [ [sg.Text("從左邊圖片列表中選擇一張圖片:")], [sg.Image(key="-IMAGE-")] ] layout = [ [ sg.Column(file_list_column), sg.VSeperator(), sg.Column(image_viewer_column), ] ] window = sg.Window("人像添加聖誕帽軟件", layout) filename = '' while True: event, values = window.read() if event == "Cancel" or event == sg.WIN_CLOSED: break if event == "-FOLDER-": folder = values["-FOLDER-"] try: file_list = os.listdir(folder) except: file_list = [] fnames = [ f for f in file_list if os.path.isfile(os.path.join(folder, f)) and f.lower().endswith((".jpg", ".png")) ] window["-FILE LIST-"].update(fnames) elif event == "-FILE LIST-": try: filename = os.path.join(values["-FOLDER-"], values["-FILE LIST-"][0]) if filename.endswith('.jpg'): im = cv2.imread(filename) cv2.imwrite(filename.replace('jpg', 'png'), im) window["-IMAGE-"].update(filename=filename.replace('jpg', 'png')) except Exception as e: print(e) elif event == "Go": try: # output = add_hat(filename) # 展示效果 # cv2.imshow("output",output) # cv2.waitKey(0) # cv2.imwrite("output.png",output) # print(output) window["-IMAGE-"].update(filename='output.png') except: print('OMG!添加失敗了!') cv2.destroyAllWindows()

這裡我選用的是 PySimpleGUI 框架來做的,比較簡單。界面分為左右兩部分,左邊是兩個按鈕(确定和取消)加一個文件夾選擇器,再加一個圖片文件列表;右邊是一個圖片展示框。

左邊選擇文件夾後,會在下方列出文件夾裡包含 .png 和 .jpg 的圖片列表。點擊圖片列表中的圖片,會在右邊顯示你所選擇的圖片。這個選中的圖片也就是我們後面需要添加聖誕帽的圖片。

這裡需要注意的是,PySimpleGUI 的圖片展示默認隻支持 png 格式的,所以我在展示的時候做了判斷,如果是 jpg 格式的圖片,我就用 cv2 将其轉換成 png 格式,然後再進行展示。

到這裡,我們的關鍵步驟就完成了。接下來就是将我們兩部分代碼進行整合。其實也很簡單,隻需要在 GUI 界面上用戶點擊 “生成” 按鈕時,後台接收到圖片的路徑,傳遞給我們的圖片處理函數,在處理完後将圖片保存在文件夾下,并更新 GUI 界面右邊的展示的圖片即可。

最終的運行效果:

python圖像濾鏡(用Python給頭像加聖誕帽并制作成可執行軟件)9

打包軟件

打包軟件我們還是用熟悉的 pyinstaller 模塊,将代碼打包成可執行的 exe 格式。

首先下載我們所需的模塊包:

pip install pyinstaller

接着在命令行敲下打包命令:

pyinstaller christmashat.py

這個 christmashat.py 就是我們所寫的程序了。

打包比較耗時,耐心等着就行。打包完成後,在我們代碼的目錄下會生成三個文件夾:

  • __pycache__
  • build
  • dist

我們隻需要關注 dist 就行。dist 文件夾下面是 christmashat 子文件夾,再進去就可以找到我們的 christmashat.exe 文件了。由于我們的程序運行有兩個依賴文件,分别是我們的聖誕帽圖片和我們的人臉識别訓練集,所以我們需要将這兩個文件放入這個 EXE 文件所在的文件夾下。

現在雙擊 christmashat.exe 文件就可以正常運行了。

總結

本文從一個實際需求出發,向大家講解了一個頭像添加聖誕帽軟件的誕生過程。相對于之前的一些小應用來說,涉及的知識點較多,可能還是有點複雜的。其中有一些知識點限于篇幅原因沒有詳細講解,大家可以自己私下補充。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
realme x50 pro 5g試用
realme x50 pro 5g試用
2020年的第一場手機發布會由realmeX50揭開面紗。從屏幕尺寸規格,前置雙攝,後置四攝。屏幕刷新率的提升,乃至售價都是圍繞着友商K305G版本來的,看來今年5G市場必定血雨腥風。那麼我們通過一篇測評文章來帶你了解一下這款隻說真話的真我...
2025-12-14
思維導圖在中學數學中的應用
思維導圖在中學數學中的應用
思維導圖是基于對人腦的模拟,所以這一“數據庫”的儲存方式和組織結構和思維導圖的“構圖”方式不謀而合。數學中的形象思維主要包含直觀形象,經驗形象,創新形象,意會形象。利用這些與思維導圖相聯系是可行的。本文以較難的數學為例,講述數學思維導圖的作...
2025-12-14
客如雲超市收銀系統好用嗎
客如雲超市收銀系統好用嗎
收銀系統千千萬,常常讓商戶老闆挑得眼花缭亂,不少老闆反饋,不知道怎麼挑選收銀系統軟件才能不踩雷。本期小編收集了市場受歡迎度較高的五個收銀系統軟件,整理了它們各自的優勢和劣勢,供大家參考。第一名:秦絲收銀系統軟件秦絲軟件是進銷存軟件中的佼佼者...
2025-12-14
質子治療系統排名
質子治療系統排名
9月26日,國家藥品監督管理局批準了上海艾普強粒子設備有限公司生産的“質子治療系統”創新産品注冊申請。該産品是“十三五”期間科技部重點研發計劃“數字診療裝備專項”的重點支持項目,也是我國首台獲準上市的國産質子治療系統。該産品的獲批上市,标志...
2025-12-14
什麼地方要裝防火窗
什麼地方要裝防火窗
随着人們消防安全意識的增強,選擇安裝防火窗的用戶越來越多,那麼大家都知道安裝防火窗時應該注意些什麼嗎[what]?今天小編就帶大家來了解一下[靈光一閃]。一、檢查防火窗在儲存或者運輸過程中有可能會不慎導緻窗框、窗扇翹曲、變形、玻璃破損,所以...
2025-12-14
Copyright 2023-2025 - www.tftnews.com All Rights Reserved