使用OpenCV-Python實現圖像處理

介紹

隨著數碼設備的普及,人們對圖像的處理需求越來越多,圖像處理技術成為了重要的工具。使用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

相關推薦