Python使用指南(一):在微信頭像上添加紅旗貼畫

指南聲明

《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對圖像進行各類操做,那麼須要瞭解的知識有如下兩個方面:

  • 數字圖像處理基礎知識
  • 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-pythonopencv-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-User-Guide/0x01

相關文章
相關標籤/搜索