(1)opencv安裝在我以前的博文上介紹過能夠翻閱;
(2)安裝imutils:算法
pip install imutils
若是是使用虛擬環境的話,記得進入虛擬環境後再安裝imutils
簡單介紹一下imutils:它是在opencv的基礎上對一些方法進行了封裝,使得一些圖像處理方法更方便易用數組
假設咱們將下載到的源碼存放在「下載」文件夾下,執行如下命令:網絡
cd 下載 unzip opencv-tutorial.zip cd opencv-tutorial tree
第一個腳本opencv_tutorial_01.py將使用電影《侏羅紀公園》中的圖像(jp.png)進行基本的圖像處理操做。
第二個腳本opencv_tutorial_02.py將介紹如何使用這些圖像處理模塊來建立OpenCV應用程序,以計算Tetris圖像(tetris_blocks.png )中的對象數量。編輯器
首先在文本編輯器或IDE中打開opencv_tutorial_01.py:函數
#導入必要的軟件包 import imutils import cv2 #加載並顯示圖像尺寸 #將圖像表示爲包含h、w、d的多維numpy數組即變量"image" #形狀參數包括行(height) x 列 (width) x 通道 (depth) image = cv2.imread("jp.png") (h, w, d) = image.shape print("width={}, height={}, depth={}".format(w, h, d)) #在屏幕上顯示圖像,鼠標要點擊到圖像窗口 #按任意鍵繼續執行程序 cv2.imshow("Image", image) cv2.waitKey(0)
深度是通道數——在咱們的例子中是3,由於咱們正在使用3個顏色通道:藍色,綠色和紅色(RGB)。
print輸出寬、高、深度:學習
width=600, height=322, depth=3
cv2.waitKey(0):等待按鍵,這一點很重要,不然咱們的圖像顯示和消失的速度將比咱們看到圖像還要快字體
全部圖像都由像素組成,640 x 480圖像具備640列(寬度)和480行(高度),有640×480 = 307200個像素點
灰度圖像中的每一個像素都有一個表明灰度的值,在OpenCV中,有256種灰度(從0到255)。所以,灰度圖像將具備與每一個像素關聯的灰度值。
彩色圖像中的像素具備其餘信息,在學習圖像處理時很快就會熟悉幾種色彩空間。爲簡單起見,咱們僅考慮RGB顏色空間。
在OpenCV彩色圖像中,RGB(紅色,綠色,藍色)顏色空間中的每一個像素都有一個3元組(B, G, R) ,注意,順序是BGR而不是RGB。
BGR 3元組中的每一個值的範圍爲[0, 255] 。OpenCV中RGB圖像中的每一個像素有多少種顏色可能性?這很簡單:256×256×256 = 16777216spa
#訪問位於x = 50(w),y = 100(h)的RGB像素 #OpenCV以BGR而不是RGB的順序存儲圖像 (B, G, R) = image[100, 50] print("R={}, G={}, B={}".format(R, G, B))
前面已知圖片尺寸爲width=600, height=322, depth=3 。咱們能夠經過指定座標來訪問數組中的各個像素值,只要它們在最大寬度和高度以內便可,圖像指定像素點的格式爲:image[Y,X]。
在終端打印出該像素的RGB值:翻譯
R=41, G=49, B=37
提取「感興趣區域」(ROI)是圖像處理的一項重要技能。
舉例來講,您正在識別電影中的人臉。首先,您將運行人臉檢測算法以查找正在使用的全部幀中人臉的座標。而後,您須要提取面部ROI,而後保存它們或對其進行處理。
手動提取ROI經過數組切片來實現:3d
#從輸入圖像提取一個100*100的感興趣區, #從x=320,y=60到x=420,y=160,並顯示圖像 roi = image[60:160, 320:420] cv2.imshow("ROI", roi) cv2.waitKey(0)
數組切片的格式爲:image[startY:endY, startX:endX],注意前閉後開
調整圖像大小很重要,緣由有不少。首先,咱們可能須要調整大圖像的大小以適合屏幕。在較小的圖像上,圖像處理也更快,由於要處理的像素更少。在深度學習的狀況下,咱們常常忽略寬高比來調整圖像的大小,以使體積適合網絡,這要求圖像是正方形且具備必定尺寸。
#忽略寬高比,將原始圖像調整爲200 x 200像素: resized = cv2.resize(image, (200, 200)) cv2.imshow("Fixed Resizing", resized) cv2.waitKey(0)
因爲忽略了寬高比,獲得的圖像已經失真。
假設要將600像素寬的圖像調整爲300像素寬,同時保持寬高比。
#固定大小調整扭曲了寬高比,因此讓咱們將寬度調整爲300px, #但根據寬高比獲得height r = 300.0 / w dim = (300, int(h * r)) resized = cv2.resize(image, dim) cv2.imshow("Aspect Ratio Resize", resized) cv2.waitKey(0)
咱們計算新寬度與舊寬度的比率(剛好是0.5)。
在此,咱們指定新圖像的尺寸dim 。咱們知道,咱們但願有一個300像素寬的圖像,但咱們必須乘以該比例計算新高度h。
將dim(圖像的尺寸)輸入到cv2.resize函數中,咱們如今得到了一個名爲resized的新圖像,該圖像沒有失真。
可是,咱們是否可使調整大小時保持寬高比的過程變得更加容易?
使用imutils中的函數:imutils.resize
#手動計算寬高比可能很麻煩, #因此讓咱們使用#imutils庫來代替 resized = imutils.resize(image, width=300) cv2.imshow("Imutils Resize", resized) cv2.waitKey(0)
這樣保留了寬高比並調整圖像的大小隻須要須要提供圖像的width或height做爲參數
# 首先計算圖像中心,"//"表示向下取整除 # 構造旋轉矩陣 # 最後應用warpAffine函數旋轉圖像 center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, -45, 1.0) rotated = cv2.warpAffine(image, M, (w, h)) cv2.imshow("OpenCV Rotation", rotated) cv2.waitKey(0)
-45表示將圖像順時針旋轉45度。回憶一下中學關於單位圓的信息,正角是逆時針方向,負角是順時針方向。
# 使用imutils執行相同的操做 rotated = imutils.rotate(image, -45) cv2.imshow("Imutils Rotation", rotated) cv2.waitKey(0)
可是以上的操做都使圖像被裁剪,運用imutils.rotate_bound函數使整個圖像保持可見。 :
rotated = imutils.rotate_bound(image, 45) cv2.imshow("Imutils Bound Rotation", rotated) cv2.waitKey(0)
在許多圖像處理場合中,咱們必須對圖像進行模糊處理以減小高頻噪聲,從而使咱們的算法更容易檢測和理解圖像的實際內容,在OpenCV中,對圖像進行模糊處理很是容易,而且有多種方法能夠完成圖像處理。
# 將具備11x11內核的高斯模糊應用於圖像以使其平滑,減小高頻噪聲 blurred = cv2.GaussianBlur(image, (11, 11), 0) cv2.imshow("Blurred", blurred) cv2.waitKey(0)
較大的內核將產生更模糊的圖像,較小的內核將建立較少的模糊圖像。
咱們將在輸入圖像上繪製矩形,圓形和直線,咱們還將在圖像上覆蓋文本。
在繼續使用OpenCV在圖像上繪圖以前,請注意,在圖像上進行繪圖操做是直接執行的。所以,在每一個代碼塊的開頭,咱們製做原始圖像的副本,並將副本存儲爲output 。而後,咱們繼續繪製output的圖像,以避免破壞原始圖像。
(1)在伊恩·馬爾科姆(Ian Malcolm)的臉上繪製一個矩形:
# 在男主臉上畫個矩形,線粗爲2 output = image.copy() cv2.rectangle(output, (320, 60), (420, 160), (0, 0, 255), 2) cv2.imshow("Rectangle", output) cv2.waitKey(0)
在OpenCV中繪製矩形比較簡單,使用預先計算的座標,向cv2.rectangle函數提供瞭如下參數:
因爲咱們使用的是OpenCV的函數而不是NumPy的操做,所以咱們能夠按(x,y)的順序而不是(y,x)的順序提供座標,由於咱們沒有直接操做或訪問NumPy數組爲咱們處理這些事情。
(2)在Ellie Sattler博士的臉前放置一個藍色實心圓:
# 畫一個實心藍色圓在x=300,y=150 output = image.copy() cv2.circle(output, (300, 150), 20, (255, 0, 0), -1) cv2.imshow("Circle", output) cv2.waitKey(0)
要繪製圓,須要向cv2.circle提供如下參數 :
(3)畫一條紅線,這條線穿過Ellie的頭,通過她的眼睛,一直到Ian的手:
# 畫一條線寬爲5的紅線從x=60,y=20到x=400,y=200 output = image.copy() cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5) cv2.imshow("Line", output) cv2.waitKey(0)
就像在矩形中同樣,須要兩個參數,顏色和線寬。
(4)在圖像上覆蓋文本:
若是進行人臉識別,則可能須要在該人的臉上方繪製該人的名字
或者若是在計算機視覺事業中取得進步,則能夠構建圖像分類器或對象檢測器,須要繪製包含類名和機率的文本。
# 在圖像上繪製文本 output = image.copy() cv2.putText(output, "OpenCV + Jurassic Park!!!", (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow("Text", output) cv2.waitKey(0)
putText函數的功能負責在圖像上繪製文本,須要的參數:
我使用的是vscode,右鍵-在終端中運行便可