介绍
随着数码设备的普及,人们对图像的处理需求越来越多,图像处理技术成为了重要的工具。使用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)
这个例子中,将5x5的平均滤波器卷积到图片上。
使用均值滤波可以去除图像的噪声,使用cv2.blur()
函数即可。
blur_img = cv2.blur(img, (5,5))
这个例子中,使用5x5的滤波器对图像进行模糊处理。
高斯滤波可以对图像进行模糊处理,同时保持图像的边缘信息。使用cv2.GaussianBlur()
函数实现。
blur_img = cv2.GaussianBlur(img, (5,5), 0)
这个例子中,使用5x5的高斯核对图像进行模糊处理,标准差为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方向上使用5x5的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)
这个例子中,将5x5的矩形形状的核应用于腐蚀操作。
使用膨胀可以去除图像中的小黑点,使用cv2.dilate()
函数实现。
dilation_img = cv2.dilate(img,kernel,iterations = 1)
这个例子中,将5x5的矩形形状的核应用于膨胀操作。
形态学操作还包括开操作、闭操作等,这里不再赘述。
三、应用
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()