问题1:请用下面鸡蛋模板在原图中检测出对应的鸡蛋图像。
SIFT(Scale-Invariant Feature Transform)是一种经典的图像特征提取算法,它能够在不同尺度和旋转情况下提取出具有良好稳定性的特征点。SIFT算法的主要步骤包括关键点检测、关键点定位、关键点描述和关键点匹配。SIFT算法通过提取出具有尺度不变性、旋转不变性和部分视角不变性的特征描述子,可用于图像检索、目标跟踪、图像拼接等计算机视觉任务。
import cv2
source_image = cv2.imread('template.jpg') # 灰度图像
target_image = cv2.imread('target.png') # 灰度图像
result = cv2.matchTemplate(target_image, source_image, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 确定模板图像的宽度和高度
template_width, template_height = source_image.shape[:2]
# 绘制矩形框标记匹配区域
top_left = max_loc
bottom_right = (top_left[0] + template_width, top_left[1] + template_height)
cv2.rectangle(target_image, top_left, bottom_right, (0, 255, 0), 2)
sift = cv2.SIFT_create()
keypoints_source, descriptors_source = sift.detectAndCompute(source_image, None)
keypoints_target, descriptors_target = sift.detectAndCompute(target_image, None)
matcher = cv2.BFMatcher()
matches = matcher.match(descriptors_source, descriptors_target)
matches = sorted(matches, key=lambda x: x.distance)
matched_image = cv2.drawMatches(source_image, keypoints_source, target_image, keypoints_target, matches[:500], None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Matches', matched_image)
cv2.imwrite('Result.jpg', matched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果图:
可以看到,使用cv2.matchTemplate可以实现原图的图像匹配,使用cv2.SIFT_create()方法可以实现SIFT特征提取算法,匹配出原图和模板具有尺度不变性、旋转不变性的特征点,效果还是不错的。
问题2:请计算得到下图的HOG特征,并对其可视化。
HOG(Histogram of Oriented Gradient)特征在对象检测与模式匹配中是一种常见的特征提取算法,是基于本地像素块进行特征直方图提取的一种算法。HOG算法的基本思想是将图像分成小的局部区域,计算每个区域内梯度方向的直方图,并将这些直方图连接起来形成特征描述子。HOG算法通过统计图像中不同方向上的梯度信息,能够捕捉到物体的边缘和纹理等局部特征,具有较好的鲁棒性和抗干扰能力。在目标检测中,通常使用滑动窗口和支持向量机(SVM)等方法,结合HOG特征来进行目标的定位和识别。
import cv2
import numpy as np
from skimage.feature import hog
# 加载图像
image = cv2.imread('target2.jpg')
# 将图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 定义HOG参数
orientations = 9 # 方向的数量
pixels_per_cell = (8, 8) # 每个细胞的像素数
cells_per_block = (2, 2) # 每个块的细胞数
# 计算HOG特征
features, hog_image = hog(gray_image, orientations=orientations,
pixels_per_cell=pixels_per_cell,
cells_per_block=cells_per_block,
visualize=True, block_norm='L2-Hys')
# 对HOG特征进行归一化处理
features = features.reshape(-1, orientations)
features = np.sqrt(features)
features = features / np.linalg.norm(features)
print('HOG特征数组:', features)
cv2.imshow('HOG Features', hog_image)
cv2.imwrite('HOG Features.png', hog_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果图:
可以看到,HOG特征数组成功计算出来,并成功可视化HOG特征在输入图像上的分布情况。