一、基础图像处理
1、读取图片:OpenCV中常用的图像格式是BGR(以像素的分量顺序为蓝(blue)、绿(green)、红(red)),可以使用cv.imread('image.jpg')命令读取,返回一个numpy数组。
import cv2 as cv
img = cv.imread('image.jpg')
2、显示图片:可以使用cv.imshow('image', img)命令在窗口中显示图片。
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()
3、调整图片大小:可以使用cv.resize(img, (width, height))命令调整图片大小。
img_sized = cv.resize(img, (600, 400))
cv.imshow('sized image', img_sized)
4、裁剪图片:可以使用numpy数组对图像进行裁剪,只需指定图像的起始点和终点。
img_cropped = img[100:300, 200:400]
cv.imshow('cropped image', img_cropped)
5、旋转图片:可以使用cv.getRotationMatrix2D(center, angle, scale)获取图像旋转矩阵,然后使用cv.warpAffine(img, rotation_matrix, (width, height))命令旋转图片。
rows, cols, _ = img.shape
rotation_matrix = cv.getRotationMatrix2D((cols/2,rows/2), 45, 1)
img_rotated = cv.warpAffine(img, rotation_matrix, (cols,rows))
cv.imshow('rotated image', img_rotated)
二、图像滤波与增强
1、模糊处理:可以使用cv.blur(img, kernel_size)进行图像模糊,其中kernel_size是卷积核的大小。
img_blur = cv.blur(img, (5,5))
cv.imshow('blurred image', img_blur)
2、锐化处理:可以使用cv.filter2D(img, -1, sharpen_kernel)进行图像锐化处理。
sharpen_kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
img_sharpen = cv.filter2D(img, -1, sharpen_kernel)
cv.imshow('sharpened image', img_sharpen)
3、边缘检测:可以使用cv.Canny(img, threshold1, threshold2)进行边缘检测,其中threshold1和threshold2是阈值。
img_canny = cv.Canny(img, 100, 200)
cv.imshow('canny image', img_canny)
4、直方图均衡化:可以使用cv.equalizeHist(img)对图像进行直方图均衡化处理。
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img_eq = cv.equalizeHist(img_gray)
cv.imshow('equalized image', img_eq)
三、图像特征提取与检测
1、轮廓检测:可以使用cv.findContours(img, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)进行轮廓检测。
img_canny = cv.Canny(img, 100, 200)
contours, hierarchy = cv.findContours(img_canny, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
cv.drawContours(img, contours, -1, (0,255,0), 2)
cv.imshow('contour image', img)
2、特征匹配:可以使用cv.matchTemplate(img1, img2, method)进行模板匹配。其中img1是要搜索的图像,img2是要匹配的图像,method是匹配算法(如cv.TM_CCOEFF)。
template = cv.imread('template.jpg')
result = cv.matchTemplate(img, template, cv.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
top_left = max_loc
bottom_right = (top_left[0] + template.shape[1], top_left[1] + template.shape[0])
cv.rectangle(img, top_left, bottom_right, (0, 255, 0), 2)
cv.imshow('matched image', img)
3、人脸检测:可以使用cv.CascadeClassifier进行人脸检测。
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
for (x,y,w,h) in faces:
cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)
cv.imshow('face detection', img)
四、图像处理实战
1、图像拼接:可以将多张图片拼接在一起,形成一张大图。
img1 = cv.imread('image1.jpg')
img2 = cv.imread('image2.jpg')
img3 = cv.imread('image3.jpg')
img4 = cv.imread('image4.jpg')
img5 = cv.imread('image5.jpg')
img_concat = np.concatenate((img1, img2, img3, img4, img5), axis=0)
cv.imshow('concatenated image', img_concat)
2、视频处理:可以使用OpenCV进行实时视频处理,如人脸检测。
cap = cv.VideoCapture(0)
face_cascade = cv.CascadeClassifier('haarcascade_frontalface_default.xml')
while True:
ret, frame = cap.read()
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
for (x,y,w,h) in faces:
cv.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
cv.imshow('video', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
3、二维码识别:可以使用OpenCV进行二维码识别。
import cv2 as cv
import numpy as np
import pyzbar.pyzbar as pyzbar
cap = cv.VideoCapture(0)
while True:
ret, frame = cap.read()
decoded_objects = pyzbar.decode(frame)
for obj in decoded_objects:
cv.putText(frame, str(obj.data), (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv.imshow('qrcode', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
以上就是OpenCV在图像处理中的应用的详细介绍,开发者可以根据自己的需求,选择相应的算法,实现不同的图像处理功能。