搞计算机视觉的小伙伴们肯定听说过OpenCV这个神器。它是个开源的计算机视觉库,用Python玩起来超级方便。今天我就给大家分享几个用OpenCV做图像识别的小技巧,保证让你的识别准确率蹭蹭往上涨!
【全198集】这才是科研人该学的计算机视觉教程!一口气学完Python、OpenCV、深度学习、PyTorch框架、卷积神经网络、目标检测、图像分割,通俗易懂!
1. 图像预处理:除噪和增强
要想识别准确,先把图像处理干净点儿。噪声就像是图像里的小石子,影响我们看清全貌。用OpenCV的高斯滤波或中值滤波,就能轻松去掉这些讨厌的小石子。
import cv2
import numpy as np
img = cv2.imread('noisy_image.jpg')
denoised = cv2.GaussianBlur(img, (5, 5), 0)
# 或者用中值滤波
# denoised = cv2.medianBlur(img, 5)
处理完噪声,再来个对比度增强,让图像更清晰:
enhanced = cv2.convertScaleAbs(denoised, alpha=1.5, beta=0)
温馨提示:别太激进哦,过度增强可能会引入新的噪声。
2. 边缘检测:Canny算法
边缘检测是识别物体形状的关键。Canny算法就像是给图像画轮廓,把物体的边界勾勒出来。
edges = cv2.Canny(enhanced, 100, 200)
这里的100和200是阈值,可以根据图像调整。数值越小,检测到的边缘越多,但也可能包含一些不重要的细节。
3. 形状匹配:模板匹配
想找到图像中的特定物体?模板匹配就是你的好帮手。它就像是在大海里找一条特定的鱼,用一个小鱼(模板)去匹配大海里的每一块区域。
template = cv2.imread('template.jpg', 0)
result = cv2.matchTemplate(gray_img, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
max_loc
就是最匹配的位置。不过这方法对尺寸和旋转比较敏感,用的时候要注意。
4. 特征点检测:SIFT算法
SIFT(尺度不变特征变换)算法是个厉害角色,它能找出图像中的关键点,而且对缩放、旋转都不怕。
sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray_img, None)
这些关键点就像图像的指纹,可以用来做物体识别或图像匹配。
5. 颜色分割:K-means聚类
有时候我们需要根据颜色来分割图像。K-means聚类就像是给像素分类,把相似颜色的像素归为一组。
pixels = img.reshape((-1, 3))
pixels = np.float32(pixels)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
_, labels, centers = cv2.kmeans(pixels, 3, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
这里我们把图像分成了3个颜色类别。你可以根据需求调整这个数字。
6. 目标跟踪:KCF跟踪器
在视频中跟踪移动的物体,KCF(Kernelized Correlation Filter)跟踪器是个不错的选择。它速度快,而且比较准确
tracker = cv2.TrackerKCF_create()
ok, bbox = tracker.init(frame, (x, y, w, h))
while True:
ok, frame = video.read()
if not ok:
break
ok, bbox = tracker.update(frame)
if ok:
(x, y, w, h) = [int(v) for v in bbox]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
7. 深度学习集成:使用预训练模型
OpenCV也能和深度学习模型玩在一起。比如,我们可以用预训练的YOLOv3模型来做目标检测:
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
blob = cv2.dnn.blobFromImage(img, 1/255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
outputs = net.forward(output_layers)
这样就能得到检测结果,包括目标的位置和类别。