介紹
隨著數碼設備的普及,人們對圖像的處理需求越來越多,圖像處理技術成為了重要的工具。使用OpenCV-Python可以輕鬆地實現對圖像的處理和分析。
OpenCV-Python是專為Python語言開發的開源計算機視覺庫,可以方便地進行各種圖像和視頻處理任務,包括但不限於顏色空間轉換、濾波、邊緣檢測、形態學處理、分割、目標檢測、人臉識別、手勢識別等。
本文將介紹OpenCV-Python的基本使用,包括圖像讀取、顯示、保存、圖像處理及相關應用。
正文
一、圖像讀取、顯示與保存
使用OpenCV-Python讀取圖像文件非常簡單,只需使用cv2.imread()
函數。
import cv2
img = cv2.imread('img.jpg')
使用cv2.imshow()
函數可以將讀入的圖像進行顯示。
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中第一個參數是顯示界面的標題,第二個參數是需要顯示的圖像,第三個參數是等待按鍵的時間,單位為毫秒。在這個時間內,如果有按鍵按下則立即顯示下一張圖片,否則等待直到時間結束,然後關閉圖片。
使用cv2.imwrite()
函數保存修改後的圖像。
cv2.imwrite('new_img.jpg', img)
二、圖像處理
1. 顏色空間轉換
使用cv2.cvtColor()
函數可以將圖像轉換為其他顏色空間。
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
這個例子中,將BGR顏色空間的圖像轉換為灰度圖像。
2. 濾波
使用濾波器可以平滑圖像、去除雜訊等。OpenCV-Python提供了多種濾波函數,包括2D卷積、均值濾波、高斯濾波等。
使用2D卷積需要自定義卷積核,使用cv2.filter2D()
函數可以進行卷積操作。
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
這個例子中,將5×5的平均濾波器卷積到圖片上。
使用均值濾波可以去除圖像的雜訊,使用cv2.blur()
函數即可。
blur_img = cv2.blur(img, (5,5))
這個例子中,使用5×5的濾波器對圖像進行模糊處理。
高斯濾波可以對圖像進行模糊處理,同時保持圖像的邊緣信息。使用cv2.GaussianBlur()
函數實現。
blur_img = cv2.GaussianBlur(img, (5,5), 0)
這個例子中,使用5×5的高斯核對圖像進行模糊處理,標準差為0。
3. 邊緣檢測
邊緣檢測是圖像處理中的重要任務,可以用於圖像分割、目標檢測等。OpenCV-Python提供多種邊緣檢測演算法,包括Sobel、Scharr、Laplacian等。
使用Sobel運算元可以檢測圖像中的梯度,進而檢測出圖像邊緣。使用cv2.Sobel()
函數實現。
sobelx_img = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely_img = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
這個例子中,將圖像分別在x和y方向上使用5×5的Sobel運算元進行檢測。
使用Laplacian運算元可以檢測圖像的二階導數,進而檢測出圖像的邊緣。使用cv2.Laplacian()
函數實現。
laplacian_img = cv2.Laplacian(img,cv2.CV_64F)
這個例子中,使用Laplacian運算元對圖像進行邊緣檢測。
4. 形態學處理
形態學處理可以用於圖像的分割和濾波。OpenCV-Python提供了多種形態學函數,包括腐蝕、膨脹、開操作、閉操作等。
使用腐蝕可以去除圖像中的小白點,使用cv2.erode()
函數實現。
kernel = np.ones((5,5),np.uint8)
erosion_img = cv2.erode(img,kernel,iterations = 1)
這個例子中,將5×5的矩形形狀的核應用於腐蝕操作。
使用膨脹可以去除圖像中的小黑點,使用cv2.dilate()
函數實現。
dilation_img = cv2.dilate(img,kernel,iterations = 1)
這個例子中,將5×5的矩形形狀的核應用於膨脹操作。
形態學操作還包括開操作、閉操作等,這裡不再贅述。
三、應用
OpenCV-Python的應用非常廣泛,包括但不限於人臉識別、手勢識別、目標檢測、圖像識別等。這裡以人臉識別為例進行介紹。
使用cv2.CascadeClassifier()
函數載入Haar級聯分類器,可以用於人臉識別。這個分類器會識別出圖像中所有人臉的位置。
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
這個例子中,使用detectMultiScale()
函數檢測圖像中的人臉位置,返回一個矩形結構用於標識人臉。
使用cv2.rectangle()
函數將人臉標識出來。
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
這個例子中,使用rectangle()
函數將每個人臉的位置畫出來,矩形的顏色為(255,0,0)。
代碼示例
下面是一個完整的使用OpenCV-Python實現圖像處理和人臉識別的示例代碼。
import cv2
import numpy as np
# 圖像讀取、顯示、保存
img = cv2.imread('img.jpg')
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('new_img.jpg', img)
# 顏色空間轉換
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 濾波
kernel = np.ones((5,5),np.float32)/25
dst = cv2.filter2D(img,-1,kernel)
blur_img = cv2.blur(img, (5,5))
blur_img = cv2.GaussianBlur(img, (5,5), 0)
# 邊緣檢測
sobelx_img = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely_img = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
laplacian_img = cv2.Laplacian(img,cv2.CV_64F)
# 形態學處理
kernel = np.ones((5,5),np.uint8)
erosion_img = cv2.erode(img,kernel,iterations = 1)
dilation_img = cv2.dilate(img,kernel,iterations = 1)
# 人臉識別
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/237942.html