[Python圖像處理] 三十四.數字圖像處理基礎與幾何圖形繪製萬字詳解(推薦)

該系列文章是講解Python OpenCV圖像處理知識,前期主要講解圖像入門、OpenCV基礎用法,中期講解圖像處理的各種算法,包括圖像銳化算子、圖像增強技術、圖像分割等,後期結合深度學習研究圖像識別、圖像分類應用。希望文章對您有所幫助,如果有不足之處,還請海涵~

前面一篇文章介紹了12種常見的圖像處理特效。這篇文章回到基礎知識,將詳細分享數字圖像處理基礎知識,包括像素及常見圖像分類、OpenCV配置、常見數據類型、Numpy和Matplotlib繪製、幾何圖形繪製等,萬字長文整理,希望對您有所幫助。同時,該部分知識均爲作者查閱資料撰寫總結,並且開設成了收費專欄,爲小寶賺點奶粉錢,感謝您的擡愛。當然如果您是在讀學生或經濟拮据,可以私聊我給你每篇文章開白名單,或者轉發原文給你,更希望您能進步,一起加油喔~

前文參考:
[Python圖像處理] 一.圖像處理基礎知識及OpenCV入門函數
[Python圖像處理] 二.OpenCV+Numpy庫讀取與修改像素
[Python圖像處理] 三.獲取圖像屬性、興趣ROI區域及通道處理
[Python圖像處理] 四.圖像平滑之均值濾波、方框濾波、高斯濾波及中值濾波
[Python圖像處理] 五.圖像融合、加法運算及圖像類型轉換
[Python圖像處理] 六.圖像縮放、圖像旋轉、圖像翻轉與圖像平移
[Python圖像處理] 七.圖像閾值化處理及算法對比
[Python圖像處理] 八.圖像腐蝕與圖像膨脹
[Python圖像處理] 九.形態學之圖像開運算、閉運算、梯度運算
[Python圖像處理] 十.形態學之圖像頂帽運算和黑帽運算
[Python圖像處理] 十一.灰度直方圖概念及OpenCV繪製直方圖
[Python圖像處理] 十二.圖像幾何變換之圖像仿射變換、圖像透視變換和圖像校正
[Python圖像處理] 十三.基於灰度三維圖的圖像頂帽運算和黑帽運算
[Python圖像處理] 十四.基於OpenCV和像素處理的圖像灰度化處理
[Python圖像處理] 十五.圖像的灰度線性變換
[Python圖像處理] 十六.圖像的灰度非線性變換之對數變換、伽馬變換
[Python圖像處理] 十七.圖像銳化與邊緣檢測之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
[Python圖像處理] 十八.圖像銳化與邊緣檢測之Scharr算子、Canny算子和LOG算子
[Python圖像處理] 十九.圖像分割之基於K-Means聚類的區域分割
[Python圖像處理] 二十.圖像量化處理和採樣處理及局部馬賽克特效
[Python圖像處理] 二十一.圖像金字塔之圖像向下取樣和向上取樣
[Python圖像處理] 二十二.Python圖像傅里葉變換原理及實現
[Python圖像處理] 二十三.傅里葉變換之高通濾波和低通濾波
[Python圖像處理] 二十四.圖像特效處理之毛玻璃、浮雕和油漆特效
[Python圖像處理] 二十五.圖像特效處理之素描、懷舊、光照、流年以及濾鏡特效
[Python圖像處理] 二十六.圖像分類原理及基於KNN、樸素貝葉斯算法的圖像分類案例
[Python圖像處理] 二十七.OpenGL入門及繪製基本圖形(一)
[Python圖像處理] 二十八.OpenCV快速實現人臉檢測及視頻中的人臉
[Python圖像處理] 二十九.MoviePy視頻編輯庫實現抖音短視頻剪切合並操作
[Python圖像處理] 三十.圖像量化及採樣處理萬字詳細總結(推薦)
[Python圖像處理] 三十一.圖像點運算處理兩萬字詳細總結(灰度化處理、閾值化處理)
[Python圖像處理] 三十二.傅里葉變換(圖像去噪)與霍夫變換(特徵識別)萬字詳細總結
[Python圖像處理] 三十三.圖像各種特效處理及原理萬字詳解(毛玻璃、浮雕、素描、懷舊、流年、濾鏡等)
[Python圖像處理] 三十四.數字圖像處理基礎與幾何圖形繪製萬字詳解(推薦)


































本文主要講解數字圖像處理基礎知識,包括圖像像素及常見圖像分類、圖像信號數字化處理、OpenCV安裝配置與入門、常見數據類型、Numpy和Matplotlib,並詳細敘述了Python和OpenCV繪製幾何圖像的函數及代碼。

一.數字圖像處理概述

數字圖像處理(Digital Image Processing)又稱爲計算機圖像處理(Computer Image Processing)[1],它是指將圖像信號轉換成數字信號並利用計算機對其進行處理的過程。數字圖像處理的產生和發展主要受三個因素的影響:一是計算機的發展;二是數學的發展(特別是離散數學理論的創立和完善);三是廣泛的農牧業、林業、環境、軍事、工業和醫學等方面的應用需求的增長[2]。
常見的數字圖像處理方法包括[1]:

  • 算術處理(Arithmetic Processing)
  • 幾何處理(Geometrical Processing)
  • 圖像增強(Image Enhancement)
  • 圖像識別(Image Recognition)
  • 圖像分類(Image Classification)
  • 圖像復原(Image Restoration)
  • 圖像重建(Image Reconstruction)
  • 圖像編碼(Image Encoding)
  • 圖像理解(Image Understanding)

圖像是人類獲取和交換信息的主要來源,因此,圖像處理的應用領域必然涉及到人類生活和工作的方方面面。隨着人類活動範圍的不斷擴大,圖像處理的應用領域也將隨之不斷擴大,包括航天航空領域、生物醫學工程領域、通信工程領域、工業工程領域、安保軍事領域、文化藝術領域、機器視覺領域、人工智能領域、電子商務領域等。


二.像素及常見圖像分類

圖像都是由像素(pixel)構成的,像素表示爲圖像中的小方格,這些小方格都有一個明確的位置和被分配的色彩數值,而這些小方格的顏色和位置就決定該圖像所呈現出來的樣子。像素是圖像中的最小單位,每一個點陣圖像包含了一定量的像素,這些像素決定圖像在屏幕上所呈現的大小。下圖表示一張由像素組成的叮噹貓[4]。

在這裏插入圖片描述

圖像通常分爲二值圖像、灰度圖像和彩色圖像,下圖展示了圖像處理經典“Lena”圖的各種圖像。

在這裏插入圖片描述

1.二值圖像
二值圖像又稱爲黑白圖像,圖像中任何一個點非黑即白,要麼爲白色(像素爲255),要麼爲黑色(像素爲0)。將灰度圖像轉換爲二值圖像的過程,常通過依次遍歷判斷實現,如果像素大於127則設置爲255,否則設置爲0。如圖所示,一幅二值圖像對應的矩陣。

在這裏插入圖片描述

2.灰度圖像
灰度圖像是指每個像素的信息由一個量化的灰度級來描述的圖像,沒有彩色信息。改變像素矩陣的RGB值,來達到彩色圖轉變爲灰度圖。常見的方法是將灰度劃分爲256種不同的顏色,將原來的RGB(R,G,B)中的R、G、B統一用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),即爲灰度圖。將彩色圖像轉換爲灰度圖是圖像處理的最基本預處理操作。具體的灰度轉換方法前面的文章介紹過。

在這裏插入圖片描述

3.彩色圖像
彩色圖像是RGB圖像,RGB表示紅、綠、藍三原色,計算機裏所有顏色都是三原色不同比例組成的,即三色通道。RGB (Red紅色,Green 綠色,Blue 藍色),是根據人眼識別的顏色而定義的空間,可用於表示大部分顏色,也是圖像處理中最基本、最常用、面向硬件的顏色空間,是一種光混合的體系。

在這裏插入圖片描述

RGB 顏色模式用三維空間中的一個點表示一種顏色,每個點有三個分量,分別表示紅、綠、藍的亮度值。在RGB模型的立方體中,原點對應的顏色爲黑色,它的三個分量值都爲0;距離原點最遠的頂點對應的顏色爲白色,三個分量值都爲1;從黑色到白色的灰度值分佈在這兩個點的連線上,該虛線稱爲灰度線;立方體的其餘各點對應不同的顏色,即三原色紅、綠、藍及其混合色黃、品紅、青色。下圖表示彩色圖像對應的RGB三原色矩陣圖。

在這裏插入圖片描述

下圖展示了圖像中某一點像素(205,89,68)所對應三原色像的素值,其中R表示紅色分量、G表示綠色分量、B表示藍色分量。

在這裏插入圖片描述


三.圖像信號數字化處理

數字圖像處理技術廣泛應用於各行各業,它主要是將現實物體離散化處理後轉換爲信號數字圖像,從而更好地進行後續的圖像處理和圖像識別等操作。下圖展示了圖像信號數字化處理的過程。

在這裏插入圖片描述

下面簡單敘述圖像的數字表示方法。令f(s, t)表示一幅具有兩個連續變量s和t的連續圖像函數。通過取樣和量化,把該函數轉換爲數字圖像。將該連續圖像取樣爲一個二維陣列f(x,y),該陣列有M行和N列,其中(x,y)是離散座標,如公式(1)所示。

在這裏插入圖片描述

在計算過程中,通常會使用傳統的矩陣表示法來表示數字圖像及其像素,如公式(2)所示。

在這裏插入圖片描述

二維矩陣是表示數字圖像的重要數學形式。一幅M×N的圖像可以表示爲矩陣,矩陣中的每個元素稱爲圖像的像素。每個像素都有它自己的位置和值,該值表示該位置像素的顏色或者強度。


四.OpenCV安裝配置

OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac 操作系統上。它是一個由C/C++語言編寫而成的輕量級並且高效的庫,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。其官方地址爲:

本書主要使用Python調用OpenCV2庫函數進行圖像處理操作,首先告知讀者如何在Python編程環境下安裝OpenCV庫。OpenCV安裝主要通過pip指令進行。如圖3所示,在命令提示符CMD環境下,通過cd命令進入Python安裝目錄的Scripts文件夾下,再調用“pip install opencv-python”命令安裝。

在這裏插入圖片描述

安裝命令如下:

  • cd C:\Python27\Scripts
  • pip install opencv-python

當OpenCV擴展包安裝成功後,在Python2.7.8中輸入“import cv2”語句導入該擴展包,測試安裝是否成功,如果沒有異常報錯即安裝成功,如下圖所示。

在這裏插入圖片描述

Python可以通過easy_install或者pip命令安裝各種各樣的包(Package),其中easy_insall提供了“傻瓜式”的在線一鍵安裝模塊的方式,而pip是easy_install的改進版,提供更好的提示信息以及查找、下載、安裝及卸載Python包等功能,常見用法如下表所示。

在這裏插入圖片描述


五.OpenCV初識及常見數據類型

1.OpenCV顯示圖像

OpenCV是一個輕量級高效的跨平臺計算機視覺庫,實現了圖像處理和計算機視覺方面的多種通用算法。所謂的圖像可以理解爲一個數組,圖像處理就是對數字的處理。在OpenCV2中,圖像的讀取和顯示是最簡單的兩句代碼,它們通過imread()和imshow()函數實現。

OpenCV讀取圖像的imread()函數原型如下,它將從指定的文件加載圖像並返回矩陣,如果無法讀取圖像(因爲缺少文件、權限不正確、格式不支持或圖像無效等),則返回空矩陣(Mat::data==NULL)。

  • retval = imread(filename[, flags])
    – filename表示需要載入的圖片路徑名,其支持Windows位圖、JPEG文件、PNG圖片、便攜文件格式、Sun rasters光柵文件、TIFF文件、HDR文件等
    – flags爲int類型,表示載入標識,它指定一個加載圖像的顏色類型,默認值爲1
    – cv2.IMREAD_UNCHANGED表示讀入完整圖像或圖像不可變,包括alpha通道
    – cv2.IMREAD_GRAYSCALE表示讀入灰度圖像
    – cv2.IMREAD_COLOR表示讀入彩色圖像,默認參數,忽略alpha通道




OpenCV中顯示圖像調用imshow()函數,它將在指定窗口中顯示一幅圖像,窗口會自動調整爲圖像大小,其原型如下所示:

  • imshow(winname, mat)
    – winname表示窗口的名稱
    – mat表示要顯示的圖像

在顯示圖像過程中,通常還會調用兩個操作窗口的函數,它們分別是waitKey()和destroyAllWindows()。

  • retval = waitKey([, delay])
    – 鍵盤綁定函數,共一個參數delay,表示等待的毫秒數,看鍵盤是否有輸入,返回值爲ASCII值。如果其參數爲0,則表示無限期的等待鍵盤輸入;參數大於0表示等待delay毫秒;參數小於0表示等待鍵盤單擊。

  • destroyAllWindows()
    – 該函數可以輕易刪除所有建立的窗口。如果你想刪除特定的窗口可以使用 cv2.destroyWindow(),並在括號內輸入要刪除的窗口名。

下面是第一個示例程序,主要用於讀取和加載經典的“Lena”圖像。

# -*- coding:utf-8 -*-
import cv2

#讀取圖片
img = cv2.imread("Lena.png")

#顯示圖像
cv2.imshow("Demo", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如下圖所示:

在這裏插入圖片描述

注意,上述代碼中如果沒有waitKey(0)函數,其運行結果可能會出現錯誤,加載一幅灰色的圖像,如圖所示。

在這裏插入圖片描述

同時,可以設置加載圖像後無限期等待,直到輸入指定的按鍵才退出窗口,如blog34_02.py代碼所示,輸入ESC才退出。

# -*- coding:utf-8 -*-
import cv2

#讀取圖片
img = cv2.imread("Lena.png")

#顯示圖像
cv2.imshow("Demo", img)

#無限期等待輸入
k=cv2.waitKey(0)

#如果輸入ESC按鍵退出
if k==27:
    cv2.destroyAllWindows()

2.常見數據類型

下面介紹OpenCV中常見的數據類型,包括點Point類、顏色Scalar類、尺寸Size類、矩形Rect類、矩陣Mat類,如下表所示。

在這裏插入圖片描述


六.Numpy和Matplotlib庫介紹

1.Numpy庫

NumPy(Numeric Python)是Python提供的數值計算擴展包,擁有高效的處理函數和數值編程工具,主要用於科學計算,如矩陣數據類型、線性代數、矢量處理等。這個庫的前身是1995年就開始開發的一個用於數組運算的庫,經過長時間的發展,基本成了絕大部分Python科學計算的基礎包,當然也包括提供給Python接口的深度學習框架。其安裝命令如下所示:

  • pip install numpy

Array是Numpy庫中最基礎的數據結構,表示數組。Numpy可以很方便地創建各種不同類型的多維數組,並且執行一些基礎操作。一維數組常見操作代碼如下所示。

# -*- coding:utf-8 -*-
import numpy as np

#定義一維數組
a = np.array([2, 0, 1, 5, 8, 3])
print('原始數據:', a)

#輸出最大、最小值及形狀
print('最小值:', a.min())
print('最大值:', a.max())
print('形狀', a.shape)

輸出如下所示,代碼通過np.array定義了一個數組[2, 0, 1, 5, 8, 3],其中min計算最小值,max計算最大值,shape表示數組的形狀,因爲是一維數組,故形狀爲6L,即6個數字。

原始數據: [2 0 1 5 8 3]  
最小值: 0  
最大值: 8  
形狀 (6L,)

在Python圖像處理中,主要通過Numpy庫繪製一張初始的背景圖像,調用np.zeros()函數繪製一張3位且長寬爲256×256的黑色圖像。注意,np.zeros()生成的數組均爲0,即表示黑色。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#顯示圖像
cv2.imshow("image", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

調用Numpy庫繪製的背景圖形如圖所示。

在這裏插入圖片描述


2.Matplotlib庫

Matplotlib是Python強大的數據可視化工具和2D繪圖庫,常用於創建海量類型的2D圖表和一些基本的3D圖表,類似於MATLAB和R語言。Matplotlib提供了一整套和Matlab相似的命令API,十分適合交互式地進行製圖,而且也可以方便地將它作爲繪圖控件,嵌入GUI應用程序中。Matplotlib是一名神經生物學家John D. Hunter博士於2007年創建,函數設計上參考了Matlab,現在在Python的各個科學計算領域都得到了廣泛應用。Matplotlib官網地址爲:http://matplotlib.org/。其安裝命令如下所示:

  • pip install matplotlib

Matplotlib作圖庫常用的函數如下:

  • Plot():用於繪製二維圖、折線圖,其格式爲plt.plot(X,Y,S)。其中X爲橫軸,Y爲縱軸,參數S爲指定繪圖的類型、樣式和顏色
  • Pie():用於繪製餅狀圖(Pie Plot)
  • Bar():用於繪製條形圖(Bar Plot)
  • Hist():用於繪製二維條形直方圖
  • Scatter():用於繪製散點圖

例如代碼“plt.scatter(x, y, c=y_pred, marker=‘o’, s=200)”,它表示繪製散點圖,橫軸爲x,縱軸爲y,c=y_pred對聚類的預測結果畫出散點圖,marker='o’表示用圓圈(Circle)繪圖,s表示設置尺寸大小(Size)。

下面的代碼是調用Matplotlib繪製散點圖的一個簡單案例。主要包括以下幾個步驟:

  • 導入Matplotlib擴展包及其子類
  • 設置繪圖的數據及參數
  • 調用Matplotlib.pyplot子類的Plot()、Pie()、Bar()、Hist()、Scatter()等函數進行繪圖
  • 設置繪圖的X軸座標、Y軸座標、標題、網格線、圖例等內容
  • 最後調用show()函數顯示已繪製的圖形
# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt

#生成隨機數表示點的座標
x = np.random.randn(200)
y = np.random.randn(200)

#生成隨機點的大小及顏色
size = 50*np.random.randn(200) 
colors = np.random.rand(200)

#用來正常顯示中文標籤
plt.rc('font', family='SimHei', size=13)

#用來正常顯示負號
plt.rcParams['axes.unicode_minus'] = False  

#繪製散點圖
plt.scatter(x, y, s=size, c=colors)

#設置x、y軸名稱
plt.xlabel(u"x座標")  
plt.ylabel(u"y座標")

#繪製標題
plt.title(u"Matplotlib繪製散點圖")

#顯示圖像
plt.show()

下面詳細講解這部分的核心代碼:

  • x = np.random.randn(200)
  • y = np.random.randn(200)
    調用Numpy庫中random.randn()函數隨機生成x和y變量,它表示點的座標,即(x,y)。同樣的方式設置點的大小和顏色爲隨機數。
  • import matplotlib.pyplot as plt
    導入matplotlib.pyplot擴展包,pyplot是用來畫圖的方法,重命名爲plt變量方便調用,比如顯示圖形時調用plt.show()函數即可,而不用調用matplotlib.pyplot.show()函數。
  • plt.scatter(x, y, s=size, c=colors)
    調用scatter()函數繪製散點圖,並通過參數設置不同點的顏色及大小,其中s參數指定大小,c參數指定顏色,隨機爲這200個點分配不同的大小及顏色。
  • plt.xlabel(u"x座標")
  • plt.ylabel(u"y座標")
    表示繪製圖形的X軸座標標題和Y軸座標標題。
  • plt.title(u"Matplotlib繪製散點圖")
    設置繪製圖形的標題爲“Matplotlib繪製散點圖”。
  • plt.show()
    表示調用pyplot.show()將填充數據的圖形顯示出來。

最終輸出如圖所示。

在這裏插入圖片描述

在OpenCV中,主要調用Matplotlib繪製顯示多張圖形,從而方便實驗對比,如代碼blog34_06.py所示。它調用cv2.imread()函數分別讀取四張圖片,並轉換爲RGB顏色空間,接着通過for循環分別設置各子圖對應的圖像、標題及座標軸名稱,其中plt.subplot(2,2)表示生成2×2張子圖。

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取圖像
img1 = cv2.imread('lena.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

img2 = cv2.imread('people.png')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

img3 = cv2.imread('flower.png')
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)

img4 = cv2.imread('scenery.png')
img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)

#顯示四張圖像
titles = ['lena', 'people', 'flower', 'scenery']
images = [img1, img2, img3, img4]
for i in range(4):
   plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

輸出如圖所示,它顯示了四幅圖像。在圖像處理對比中,同時對比多種算法的處理效果是非常重要的手段之一。

在這裏插入圖片描述


七.幾何圖形繪製

本小節主要講解OpenCV中幾何圖形的繪製方法,包括cv2.line()、v2.circle()、cv2.rectangle()、cv2.ellipse()、cv2.polylines()、cv2.putText()函數。

1.繪製直線

在OpenCV中,繪製直線需要獲取直線的起點和終點座標,調用cv2.line()函數實現該功能。該函數原型如下所示:

  • img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – img表示需要繪製的那幅圖像
    – pt1表示線段第一個點的座標
    – pt2表示線段第二個點的座標
    – color表示線條顏色,需要傳入一個RGB元組,如(255,0,0)代表藍色
    – thickness表示線條粗細
    – lineType表示線條的類型
    – shift表示點座標中的小數位數。






下面的代碼是繪製一條直線,通過np.zeros()創建一幅黑色圖像,接着調用cv2.line()繪製直線,參數包括起始座標和顏色、粗細。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製直線
cv2.line(img, (0,0), (255,255), (55,255,155), 5)

#顯示圖像
cv2.imshow("line", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示,從座標(0,0)到(255,255)繪製一條直線,其直線顏色爲(55,255,155),粗細爲5。

在這裏插入圖片描述

基本線條的繪製方法掌握之後,我們能進行簡單的變化,比如下面的代碼增加了一個簡單循環,將圖形繪製成了四部分。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製直線
i = 0
while i<255:
    cv2.line(img, (0,i), (255,255-i), (55,255,155), 5)
    i = i + 1

#顯示圖像
cv2.imshow("line", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示。

在這裏插入圖片描述


2.繪製矩形

在OpenCV中,繪製矩形通過cv2.rectangle()函數實現,該函數原型如下所示:

  • img = rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – img表示需要繪製的那幅圖像
    – pt1表示矩形的左上角位置座標
    – pt2表示矩形的右下角位置座標
    – color表示矩形的顏色
    – thickness表示邊框的粗細
    – lineType表示線條的類型
    – shift表示點座標中的小數位數






下面的代碼是繪製一個矩形,通過np.zeros()創建一幅黑色圖像,接着調用cv2.rectangle()繪製矩形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製矩形
cv2.rectangle(img, (20,20), (150,250), (255,0,0), 2)

#顯示圖像
cv2.imshow("rectangle", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖3-18所示,從左上角座標爲(20,20),右下角座標爲(150,250),繪製的矩形顏色爲藍色(255,0,0),粗細爲2。

在這裏插入圖片描述


3.繪製圓形

在OpenCV中,繪製矩形通過cv2.rectangle()函數實現,該函數原型如下所示:

  • img = circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    – img表示需要繪製圓的圖像
    – center表示圓心座標
    – radius表示圓的半徑
    – color表示圓的顏色
    – thickness如果爲正值,表示圓輪廓的厚度;負厚度表示要繪製一個填充圓。
    – lineType表示圓的邊界類型
    – shift表示中心座標和半徑值中的小數位數






下面的代碼是繪製一個圓形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製圓形
cv2.circle(img, (100,100), 50, (255,255,0), -1)

#顯示圖像
cv2.imshow("circle", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖3-19所示,它在圓形爲(100,100)的位置,繪製了一個半徑爲50,顏色爲(255,255,0)、粗細爲4的圓。

在這裏插入圖片描述

注意,如果將粗細設置爲“-1”,則繪製的圓爲實心,如圖所示。

  • cv2.circle(img, (100,100), 50, (255,255,0), -1)

在這裏插入圖片描述


4.繪製橢圓

在OpenCV中,繪製橢圓比較複雜,要多輸入幾個參數,如中心點的位置座標,長軸和短軸的長度,橢圓沿逆時針方向旋轉的角度等。cv2.ellipse()函數原型如下所示:

  • img = ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
    – img表示需要繪製橢圓的圖像
    – center表示橢圓圓心座標
    – axes表示軸的長度(短半徑和長半徑)
    – angle表示偏轉的角度(逆時針旋轉)
    – startAngle表示圓弧起始角的角度(逆時針旋轉)
    – endAngle表示圓弧終結角的角度(逆時針旋轉)
    – color表示線條的顏色
    – thickness如果爲正值,表示橢圓輪廓的厚度;負值表示要繪製一個填充橢圓
    – lineType表示圓的邊界類型
    – shift表示中心座標和軸值中的小數位數









下面是繪製一個橢圓的代碼。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製橢圓
#橢圓中心(120,100) 長軸和短軸爲(100,50)
#偏轉角度爲20
#圓弧起始角的角度0 圓弧終結角的角度360
#顏色(255,0,255) 線條粗細2
cv2.ellipse(img, (120, 100), (100, 50), 20, 0, 360, (255, 0, 255), 2)

#顯示圖像
cv2.imshow("ellipse", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示,其橢圓中心爲(120,100),長軸爲100,短軸爲50,偏轉角度爲20,圓弧起始角的角度爲0,圓弧終結角的角度爲360,表示一個完整的橢圓。繪製的顏色爲(255,0,255),粗細爲2。

在這裏插入圖片描述

下面的代碼是繪製一個實心橢圓。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製橢圓
cv2.ellipse(img, (120, 120), (120, 80), 40, 0, 360, (255, 0, 255), -1)

#顯示圖像
cv2.imshow("ellipse", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

繪製如圖所示的圖形。

在這裏插入圖片描述


5.繪製多邊形

在OpenCV中,調用cv2.polylines()函數繪製多邊形,它需要指定每個頂點的座標,通過這些點構建多邊形,其函數原型如下所示:

  • img = polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
    – img表示需要繪製的圖像
    – center表示多邊形曲線陣列
    – isClosed表示繪製的多邊形是否閉合,False表示不閉合
    – color表示線條的顏色
    – thickness表示線條粗細
    – lineType表示邊界類型
    – shift表示頂點座標中的小數位數






下面是繪製一個多邊形的代碼。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製多邊形
pts = np.array([[10,80], [120,80], [120,200], [30,250]])
cv2.polylines(img, [pts], True, (255, 255, 255), 5)

#顯示圖像
cv2.imshow("ellipse", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示,繪製的多邊形爲白色的閉合圖形。

在這裏插入圖片描述

下面的代碼是繪製一個五角星多邊形。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((512,512,3), np.uint8)

#繪製多邊形
pts = np.array([[50, 190], [380, 420], [255, 50], [120, 420], [450, 190]])
cv2.polylines(img, [pts], True, (0, 255, 255), 10)

#顯示圖像
cv2.imshow("ellipse", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示,它將五個頂點左邊分別連接起來,構成了一個黃色的五角星。

在這裏插入圖片描述


6.繪製文字

在OpenCV中,調用cv2.putText()函數添加對應的文字,其函數原型如下所示:

  • img = putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
    – img表示要繪製的圖像
    – text表示要繪製的文字
    – org表示要繪製的位置,圖像中文本字符串的左下角
    – fontFace表示字體類型,具體查看see cv::HersheyFonts
    – fontScale表示字體的大小,計算爲比例因子乘以字體特定的基本大小
    – color表示字體的顏色
    – thickness表示字體的粗細
    – lineType表示邊界類型
    – bottomLeftOrigin如果爲真,則圖像數據原點位於左下角,否則它在左上角








下面是繪製文字的代碼。

# -*- coding:utf-8 -*-
import cv2
import numpy as np

#創建黑色圖像
img = np.zeros((256,256,3), np.uint8)

#繪製文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'I love Python!!!',
            (10, 100), font, 0.6, (255, 255, 0), 2)

#顯示圖像
cv2.imshow("polylines", img)

#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

輸出結果如圖所示,繪製的文字爲“I love Python!!!”。

在這裏插入圖片描述


八.總結

本文首先普及了數字圖像處理、像素、數字化處理等基礎知識,接着講解OpenCV安裝過程及常見數據類型、Numpy和Matplotlib庫在圖像處理中的應用,最後詳細講解了幾何圖形繪製的方法。本章知識較爲基礎,將爲後續的Python圖像處理提供相關支撐。

時光嘀嗒嘀嗒的流失,這是我在CSDN寫下的第八篇年終總結,比以往時候來的更早一些。《敏而多思,寧靜致遠》,僅以此篇紀念這風雨兼程的一年,這感恩的一年。列車上只寫了一半,這兩天完成,思遠,思君O(∩_∩)O

在這裏插入圖片描述

2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大數據分析、網絡空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的算法實現。娜璋之家會更加系統,並重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝。

在這裏插入圖片描述

(By:Eastmount 2021-01-12 晚上11點 http://blog.csdn.net/eastmount/ )


參考文獻,在此感謝這些大佬,共勉!

  • [1] 岡薩雷斯. 數字圖像處理(第3版)[M]. 北京:電子工業出版社, 2013.
  • [2] 阮秋琦. 數字圖像處理學(第3版)[M]. 北京:電子工業出版社,2008.
  • [3] 楊秀璋, 顏娜. Python網絡數據爬取及分析從入門到精通(分析篇)[M]. 北京:北京航天航空大學出版社, 2018.
  • [4] 張錚,王豔平,薛桂香等. 數字圖像處理與機器視覺——Visual C++與Matlab實現[M]. 北京:人民郵電出版社,2014.
  • [5] godadream. OpenCV的數據類型——基礎數據類型[EB/OL]. (2018-08-14). https://blog.csdn.net/godadream/article/details/81670495.
  • [6] sinat_26917383. opencv︱圖片與視頻的讀入、顯示、寫出、放縮與基本繪圖函數介紹[EB/OL]. (2017-04-09). https://blog.csdn.net/sinat_26917383/article/details/69817532.
  • [7] 我i智能. Python下opencv使用筆記(二)(簡單幾何圖像繪製)[EB/OL]. (2015-07-07). https://blog.csdn.net/on2way/article/details/46793911.
  • [8] Jumping boy. python+OpenCV圖像處理(三)繪製簡單的幾何圖形、顯示文字[EB/OL]. (2018-05-26). https://blog.csdn.net/qq_40962368/article/details/80463108.
  • [9] Eastmount. [計算機圖形學課程] 一.MFC基本繪圖函數使用方法[EB/OL]. (2016-11-16). https://blog.csdn.net/Eastmount/article/details/53180524.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章