本指南系列文章一般分為以下四部分:
- 開發環境
- 需求分析
- 相關知識
- 代碼實現
其中,開發環境部分會因為需求不同而發生改變,在你嘗試運行相應文章的代碼時請注意你的開發環境是否與文章開發環境相匹配或兼容。
此外,本指南所涉及的Python代碼實現存檔於Python-User-Guide倉庫,歡迎大家前去Star。還要特別注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教!
開發環境
基礎環境
-
OS:Window 10
-
Python:Python 3.7.4-64bit
-
IDE:JetBrains PyCharm 2019.2.2 x64
使用的第三方庫
-
opencv-python-4.1.1.26
-
opencv-contrib-python-4.1.1.26
-
numpy-1.17.2
需求分析
本篇文章的需求是在微信頭像上添加紅旗貼畫,這一需求來自最近很火的@微信官方給自己的微信頭像添加紅旗貼畫。
該需求涉及到對使用Python對圖像進行各種操作,那么需要了解的知識有以下兩個方面:
- 數字圖像處理基礎知識
- Python圖像處理庫的安裝和使用
在經過一系列的Google搜索后,將我對於這兩方面的了解總結於下面相關知識部分。
相關知識
數字圖像處理
數字圖像都是由像素構成。在一張數字圖像中,每個像素都有明確的位置和被分配的色彩數值。
常見的數字圖像有灰度圖像和RGB圖像,其中灰度圖像主要用於進行一些高階圖像處理操作,在本片文章中不涉及相關知識,故不加以贅述。
以常見的RGB圖像為例,一張RGB圖像可以被理解為一個多維矩陣,每個像素點為一個矩陣元素,像素點本身又是一個包含R(Red)、G(Green)、B(Blue)三色數值的向量。在計算機中,任何顏色都可由紅、綠、藍三原色疊加而成,用數字圖像處理領域相關術語描述則分別是R通道、G通道、B通道,在后面進行圖像處理時這三個通道會被經常用到。
Python圖像處理庫
本篇文章中選擇的Python數字圖像處理庫是OpenCV,選擇的原因是Google搜索使用Python進行圖像處理
時看到的第一頁搜索結果都是它,所以你也可以使用Pillow等圖像處理庫,在基本功能功能和調用API上都差不多。
需要注意的是,在使用OpenCV時,需配套安裝numpy
庫,這是因為opencv-python
依賴於numpy
進行矩陣數值處理。
安裝opencv及numpy
打開Pycharm->File->Settings->Project Interpreter,點擊+
,如下圖:

搜索opencv-python
和opencv-contrib-python
安裝OpenCV庫及其擴展:


搜索numpy
安裝numpy庫:

基本使用
導入cv模塊
import cv2 as cv import numpy as np 復制代碼
加載圖像並顯示
src = cv.imread("head.jpg") cv.namedWindow("head", cv.WINDOW_AUTOSIZE) cv.imshow("head", src) cv.waitKey(0) cv.destroyAllWindows() 復制代碼

查看圖像基本參數
print(src.shape)
# 輸出:高,寬,通道數 (460,460,3) 復制代碼
放大、縮小圖像
h, w, c = src.shape
dst = cv.resize(src, (h//2, w//2)) cv.imshow("resize-image", dst) 復制代碼

代碼實現
import cv2 as cv class AddFlag(): def __init__(self, head_img, flag_img): self.head_img = head_img self.flag_img = flag_img def add_flag(self): try: head_img = self.head_img flag_img = self.flag_img # 讀取頭像和紅旗貼畫 img_head = cv.imread(head_img) img_flag = cv.imread(flag_img) # 獲取頭像和紅旗貼畫寬度 w_head, h_head = img_head.shape[:2] w_flag, h_flag = img_flag.shape[:2] # 計算紅旗貼畫縮放比例 scale = w_head / w_flag / 4 # 縮放圖案 img_flag = cv.resize(img_flag, (0, 0), fx=scale, fy=scale) # 獲取縮放后的紅旗貼畫寬高 w_flag, h_flag = img_flag.shape[:2] # 按3個通道合並圖片 for c in range(0, 3): img_head[w_head - w_flag:, h_head - h_flag:, c] = img_flag[:, :, c] # 保存最終結果 cv.imwrite('head_flag.jpg', img_head) return 'success' except Exception as e: print('ERROR: ' + e) head_img = AddFlag('head.jpg', 'flag.png') head_img.add_flag() 復制代碼
最終效果

最后注意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新python教程項目,還可以跟老司機交流討教!
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。