Practical Python and OpenCV,3rd Edition 03

代碼

import numpy as np 
import cv2
canvas = np.zeros((300,300,3),dtype="uint8")

解釋:

前兩個是導入python庫,接著就構造一個Numpy數組,使用.zeros方法初始化一個300 rows 和 300 columns的矩陣(也就是說畫布的大小為300x300=90000個像素大小),同時還分配了3個channels,one for Red,Green,and Blue,respectively。同時需要注意的是數據類型,dtype。由於我們將圖像表示為像素在[0,255]範圍內的RGB圖像,因此我們使用8位無符號整數或uint8。

green = (0,255,0)
cv2.line(canvas,(0,0),(300,300),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
red = (0,0,255)
cv2.line(canvas,(300,0),(0,300),red,3)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解釋:

前面我們初始化了我們的畫布,接下來我們開始畫直線,首先我們定義了一個元組(tuple)來定義畫筆的顏色,這裡是綠色,然後我們調用.line方法,該方法的第一個參數是我們繪製的畫布,第二個參數是該line的起點,我們設置開始點為(0,0),我們還需要為該line提供一個結束點(第三個參數)。我們將結束點設置為(300,300),最後一個參數是我們畫筆的顏色,我們設置為綠色。接著將我們的圖像顯示出來,並且wait for a keypress.

第二段代碼的.line方法的最後一個參數3就是我們畫筆的thickness了,也就是畫筆的厚度了。

顯示效果為:

Practical Python and OpenCV,3rd Edition 03

cv2.rectangle(canvas,(10,10),(60,60),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(50,200),(200,225),red,5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
blue = (255,0,0)
cv2.rectangle(canvas,(200,50),(225,125),blue,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解釋:

第一段代碼我們使用了.rectangle方法,該方法的第一個參數是我們要畫的畫布,第二個參數是我們的rectangle的starting(x,y)位置,這裡我們設置我們rectangle的開始point為(10,10),然後我們還得設置我們矩形的結束點為(60,60),這個時候我們定義了一個(60-10,60-10)=(50,50)大小的像素區域。最後一個就是我們矩形的顏色了。第二段代碼的第一行的最後一個參數是畫筆的厚度,第三段代碼的最後一個參數表示繪製一個solid(實心)的矩形。

顯示效果為:

Practical Python and OpenCV,3rd Edition 03

canvas = np.zeros((300,300,3),dtype="uint8")
(centerX,centerY) = (canvas.shape[1] // 2 , canvas.shape[0] // 2)
white = (255,255,255)
for r in range(0,175,25):
cv2.circle(canvas,(centerX,centerY),r,white)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解釋:

我們首先初始化我們的畫布,然後我們計算兩個變量:centerX和centerY。這兩個變量代表圖像中心的(x,y)的座標。我們首先獲取圖像的寬度(也就是列),通過.shape[1]獲取,然後獲取圖像的高度(也就是行),通過.shape[0]獲取,最後用//(取C語言的除法,不保留小數)除以2獲取中心位置。獲取了圓心的位置,接下來,用一個for循環,starting from 0 and ending at 150,每一次增加25的半徑來畫圓。.circle方法的第一個參數是我們的畫布,然後我們將圓心座標傳給第二個參數,第三個參數是我們的半徑大小r,最後一個是我們的圓的顏色。

顯示效果為:

Practical Python and OpenCV,3rd Edition 03

for i in range(0,25):
radius = np.random.randint(5, high = 200)
color = np.random.randint(0, high = 256 , size = (3,)).tolist()
pt = np.random.randint(0, high = 300, size=(2,))
cv2.circle(canvas,tuple(pt),radius,color,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

解釋:

接下來我們畫25個圓,用一個for循環來實現。首先是半徑,我們使用Numpy的.random.randint方法生成[5,200)範圍內的半徑值,接著用該方法生成RGB顏色,範圍是[0,255],為了得到三個隨機的整數,而不是一個整數,我們傳遞關鍵字參數size=(3,),數字3表示有3個數據,這樣我們就獲取了由3個值為[0,255]的隨機數組成的元組來表示我們的RGB顏色了。接著哦我們需要一個圓心的point,我們也設置pt為[0,300)的值,但是圓心只需要兩個數字,即(x,y)即可,因此,size=(2,)。最後我們調用.circle方法來畫我們的圓。

顯示效果為:

Practical Python and OpenCV,3rd Edition 03

運行程序

Practical Python and OpenCV,3rd Edition 03

點擊圖片部分,按鍵盤任意鍵結束腳本。

完整的代碼

import numpy as np 
import cv2
canvas = np.zeros((300,300,3),dtype="uint8")
green = (0,255,0)
cv2.line(canvas,(0,0),(300,300),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
red = (0,0,255)
cv2.line(canvas,(300,0),(0,300),red,3)

cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(10,10),(60,60),green)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
cv2.rectangle(canvas,(50,200),(200,225),red,5)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
blue = (255,0,0)
cv2.rectangle(canvas,(200,50),(225,125),blue,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
canvas = np.zeros((300,300,3),dtype="uint8")
(centerX,centerY) = (canvas.shape[1] // 2 , canvas.shape[0] // 2)
white = (255,255,255)
for r in range(0,175,25):
cv2.circle(canvas,(centerX,centerY),r,white)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
for i in range(0,25):
radius = np.random.randint(5, high = 200)
color = np.random.randint(0, high = 256 , size = (3,)).tolist()
pt = np.random.randint(0, high = 300, size=(2,))
cv2.circle(canvas,tuple(pt),radius,color,-1)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)

用到的函數

cv2.line

cv2.rectangle

cv2.circle

更多的參考:

https://ppao.pyimagesearch.com/lessons/ppao-chapter-5-drawing/

小測驗:

請實現下圖效果,儘可能用少的代碼。

Practical Python and OpenCV,3rd Edition 03

答案下載地址(參考我的博客):https://0leo0.github.io/2018/OpenCV_python3_03.html


分享到:


相關文章: