opencv學習指南入門篇(一)

(注:本文摘錄自Adrian Rosebrock的教程文章經翻譯整理而來)

1.在Ubuntu16.04系統上安裝OpenCV和imutils

(1)opencv安裝在我以前的博文上介紹過能夠翻閱;
(2)安裝imutils:算法

pip install imutils

若是是使用虛擬環境的話,記得進入虛擬環境後再安裝imutils
簡單介紹一下imutils:它是在opencv的基礎上對一些方法進行了封裝,使得一些圖像處理方法更方便易用數組

2.查看咱們opencv項目結構

假設咱們將下載到的源碼存放在「下載」文件夾下,執行如下命令:網絡

cd 下載
unzip opencv-tutorial.zip
cd opencv-tutorial
tree

opencv項目結構.png
第一個腳本opencv_tutorial_01.py將使用電影《侏羅紀公園》中的圖像(jp.png)進行基本的圖像處理操做。
第二個腳本opencv_tutorial_02.py將介紹如何使用這些圖像處理模塊來建立OpenCV應用程序,以計算Tetris圖像(tetris_blocks.png )中的對象數量。編輯器

3.加載並顯示圖像

首先在文本編輯器或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):等待按鍵,這一點很重要,不然咱們的圖像顯示和消失的速度將比咱們看到圖像還要快字體

4.訪問單個像素

全部圖像都由像素組成,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

5.提取感興趣區域(ROI)

提取「感興趣區域」(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],注意前閉後開

6.調整圖像大小

調整圖像大小很重要,緣由有不少。首先,咱們可能須要調整大圖像的大小以適合屏幕。在較小的圖像上,圖像處理也更快,由於要處理的像素更少。在深度學習的狀況下,咱們常常忽略寬高比來調整圖像的大小,以使體積適合網絡,這要求圖像是正方形且具備必定尺寸。

#忽略寬高比,將原始圖像調整爲200 x 200像素:
resized = cv2.resize(image, (200, 200))
cv2.imshow("Fixed Resizing", resized)
cv2.waitKey(0)

因爲忽略了寬高比,獲得的圖像已經失真。
失真圖片.png

假設要將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的新圖像,該圖像沒有失真。
未失真圖像.png
可是,咱們是否可使調整大小時保持寬高比的過程變得更加容易
使用imutils中的函數:imutils.resize

#手動計算寬高比可能很麻煩,
#因此讓咱們使用#imutils庫來代替
resized = imutils.resize(image, width=300)
cv2.imshow("Imutils Resize", resized)
cv2.waitKey(0)

這樣保留了寬高比並調整圖像的大小隻須要須要提供圖像的width或height做爲參數
2020-02-29 17-07-54屏幕截圖.png

7.旋轉圖像

# 首先計算圖像中心,"//"表示向下取整除
# 構造旋轉矩陣
# 最後應用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度。回憶一下中學關於單位圓的信息,正角是逆時針方向,負角是順時針方向。
xie.png

# 使用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)

2020-02-29 17-21-18屏幕截圖.png

8.平滑圖像

在許多圖像處理場合中,咱們必須對圖像進行模糊處理以減小高頻噪聲,從而使咱們的算法更容易檢測和理解圖像的實際內容,在OpenCV中,對圖像進行模糊處理很是容易,而且有多種方法能夠完成圖像處理。

# 將具備11x11內核的高斯模糊應用於圖像以使其平滑,減小高頻噪聲
blurred = cv2.GaussianBlur(image, (11, 11), 0)
cv2.imshow("Blurred", blurred)
cv2.waitKey(0)

較大的內核將產生更模糊的圖像,較小的內核將建立較少的模糊圖像。
2.png

9.在圖像上繪圖

咱們將在輸入圖像上繪製矩形,圓形和直線,咱們還將在圖像上覆蓋文本。
在繼續使用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函數提供瞭如下參數:

  • img :要繪製的目標圖像output
  • pt1 :起始像素座標,在咱們的例子中位於左上角,(320, 60)
  • pt2 :結束像素座標,右下角的像素位於(420, 160)
  • color :BGR元組,紅色(0 , 0, 255)
  • thickness :線粗(負值將造成一個實心矩形),,這裏爲2

因爲咱們使用的是OpenCV的函數而不是NumPy的操做,所以咱們能夠按(x,y)的順序而不是(y,x)的順序提供座標,由於咱們沒有直接操做或訪問NumPy數組爲咱們處理這些事情。
1.png
(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)

3.png
要繪製圓,須要向cv2.circle提供如下參數 :

  • img :圖像名稱
  • center :圓的中心座標,這裏是(300, 150)
  • radius :圓半徑(以像素爲單位),設置爲20個像素值
  • color :圓圈顏色,藍色(255, 0, 0)
  • thickness :線的粗細,使用負值(-1),所以圓圈是實心的

(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.png
(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函數的功能負責在圖像上繪製文本,須要的參數:

  • img :圖像名稱
  • text :要在圖像上寫/畫的文本字符串
  • pt :文本的起點
  • font :常常用cv2.FONT_HERSHEY_SIMPLEX字體,能夠官網查閱
  • scale :字體大小
  • color :文字顏色
  • thickness :筆劃的粗細(以像素爲單位)

5.png

10.運行腳本

我使用的是vscode,右鍵-在終端中運行便可

相關文章
相關標籤/搜索