本指南系列文章一般分為以下四部分:
- 開發環境
- 需求分析
- 相關知識
- 代碼實作
其中,開發環境部分會因為需求不同而發生改變,在你嘗試運行相應文章的代碼時請注意你的開發環境是否與文章開發環境相匹配或兼容,
此外,本指南所涉及的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 = https://www.cnblogs.com/chengxuyuanaa/p/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教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/150700.html
標籤:Python
上一篇:關于flask(前后端分離)的后端開發的小白筆記整理(含postman,jwt,json,SQLAlchemy等)
