《Python使用指南》系列文章基於個人Python學習過程總結而成,主要內容是對各個實際需求從需求分析到使用Python進行實現的全幅記錄。因爲技術和語文水平有限,該指南可能存在各類技術或表達問題,歡迎你留言進行討論。python
本指南系列文章通常分爲如下四部分:git
其中,開發環境部分會由於需求不一樣而發生改變,在你嘗試運行相應文章的代碼時請注意你的開發環境是否與文章開發環境相匹配或兼容。github
此外,本指南所涉及的Python代碼實現存檔於Python-User-Guide倉庫,歡迎你們前去Star。微信
OS:Window 10ide
Python:Python 3.7.4-64bit學習
IDE:JetBrains PyCharm 2019.2.2 x64ui
opencv-python-4.1.1.26spa
opencv-contrib-python-4.1.1.263d
numpy-1.17.2code
本篇文章的需求是在微信頭像上添加紅旗貼畫,這一需求來自最近很火的@微信官方給本身的微信頭像添加紅旗貼畫。
該需求涉及到對使用Python對圖像進行各類操做,那麼須要瞭解的知識有如下兩個方面:
在通過一系列的Google搜索後,將我對於這兩方面的瞭解總結於下面相關知識部分。
數字圖像都是由像素構成。在一張數字圖像中,每一個像素都有明確的位置和被分配的色彩數值。
常見的數字圖像有灰度圖像和RGB圖像,其中灰度圖像主要用於進行一些高階圖像處理操做,在本片文章中不涉及相關知識,故不加以贅述。
以常見的RGB圖像爲例,一張RGB圖像能夠被理解爲一個多維矩陣,每一個像素點爲一個矩陣元素,像素點自己又是一個包含R(Red)、G(Green)、B(Blue)三色數值的向量。在計算機中,任何顏色均可由紅、綠、藍三原色疊加而成,用數字圖像處理領域相關術語描述則分別是R通道、G通道、B通道,在後面進行圖像處理時這三個通道會被常常用到。
本篇文章中選擇的Python數字圖像處理庫是OpenCV,選擇的緣由是Google搜索使用Python進行圖像處理
時看到的第一頁搜索結果都是它,因此你也可使用Pillow等圖像處理庫,在基本功能功能和調用API上都差很少。
須要注意的是,在使用OpenCV時,需配套安裝numpy
庫,這是由於opencv-python
依賴於numpy
進行矩陣數值處理。
打開Pycharm->File->Settings->Project Interpreter,點擊+
,以下圖:
搜索opencv-python
和opencv-contrib-python
安裝OpenCV庫及其擴展:
搜索numpy
安裝numpy庫:
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-User-Guide/0x01