Harris 角点检测和 Daisy 描述符匹配
import cv2
import numpy as np
from skimage.feature import daisy
from skimage.color import rgb2gray
from skimage import img_as_ubyte, img_as_float
R = 120 # Distance from center pixel (radius)
E = 40 # Distance between descriptor sampling points (step)
Q = 2 # Number of layers (rings)
T = 6 # Number of histograms at a single layer (histograms)
H = 8 # Number of bins in the histogram (orientations)
S = Q * T + 1 # Total number of histograms
D = S * H # Total size of descriptor vector
def harris_corner_detection(image):
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
harris_res = cv2.cornerHarris(gray, 2, 3, 0.04) # Harris corner detection
harris_res = cv2.dilate(harris_res, None) # Dilate corners to make them more prominent
# Thresholding to get the corner points
threshold = 0.01 * harris_res.max()
corner_coords = np.where(harris_res > threshold)
return corner_coords
def extract_daisy_descriptor(image):
gray = rgb2gray(image)
descriptor = daisy(gray, step=E, radius=R, rings=Q, histograms=T, orientations=H)
return descriptor
def match_features(descriptor1, descriptor2):
# Adjust descriptor dimensions
descriptor1 = descriptor1.reshape(descriptor1.shape[0], -1)
descriptor2 = descriptor2.reshape(descriptor2.shape[0], -1)
# Perform nearest neighbor matching
matches = []
for i in range(descriptor1.shape[0]):
best_match_idx = np.argmin(np.linalg.norm(descriptor2 - descriptor1[i], axis=1))
distance = np.linalg.norm(descriptor1[i] - descriptor2[best_match_idx])
matches.append((i, best_match_idx, distance))
# Sort matches based on distance
matches.sort(key=lambda x: x[2])
return matches
# Load input images
image1 = cv2.imread('03751.jpg')
image2 = cv2.imread('depthxing.jpg')
# Extract feature points using Harris corner detection
feature_coords1 = harris_corner_detection(image1)
feature_coords2 = harris_corner_detection(image2)
# Convert image data to float
image1 = img_as_float(image1)
image2 = img_as_float(image2)
# Extract Daisy descriptors for feature points
descriptor1 = extract_daisy_descriptor(image1)
descriptor2 = extract_daisy_descriptor(image2)
# Match features
matches = match_features(descriptor1, descriptor2)
# Visualize the matches
matched_image = cv2.drawMatches(image1, feature_coords1, image2, feature_coords2, matches[:10], None, flags=2)
# Display the matched image
cv2.imshow('Matched Image', matched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
这段代码使用 Harris 角点检测和 Daisy 描述符匹配来识别图像中的特征点。代码首先使用 Harris 角点检测来找到图像中的角点,然后使用 Daisy 描述符来提取这些角点的特征向量。最后,使用最近邻匹配来找到两幅图像之间的匹配特征点。
这段代码使用了 OpenCV 库来可视化匹配结果。代码首先加载两幅图像,然后使用 Harris 角点检测和 Daisy 描述符匹配来找到匹配的特征点。最后,使用 OpenCV 的 drawMatches 函数将匹配结果可视化。
代码解释:
-
导入库:
cv2: OpenCV 库numpy: 科学计算库skimage.feature.daisy: Daisy 描述符库skimage.color.rgb2gray: 图像灰度化库skimage.img_as_ubyte, skimage.img_as_float: 图像数据类型转换库
-
定义参数:
R: Daisy 描述符的半径E: Daisy 描述符的步长Q: Daisy 描述符的层数T: Daisy 描述符的直方图数量H: Daisy 描述符的直方图 bin 数量
-
定义 Harris 角点检测函数:
harris_corner_detection(image): 输入图像,返回 Harris 角点坐标- 首先将图像转换为灰度图像
- 使用
cv2.cornerHarris()函数进行 Harris 角点检测 - 使用
cv2.dilate()函数膨胀角点,使其更明显 - 使用阈值对角点进行筛选,返回大于阈值的角点坐标
-
定义 Daisy 描述符提取函数:
extract_daisy_descriptor(image): 输入图像,返回 Daisy 描述符- 首先将图像转换为灰度图像
- 使用
daisy()函数提取 Daisy 描述符
-
定义特征匹配函数:
match_features(descriptor1, descriptor2): 输入两个图像的 Daisy 描述符,返回匹配结果- 首先调整 Daisy 描述符的维度,使其成为一个一维向量
- 使用最近邻匹配来找到两幅图像之间的匹配特征点
- 将匹配结果按照距离从小到大排序,并返回匹配结果
-
加载图像:
image1 = cv2.imread('03751.jpg'): 加载第一幅图像image2 = cv2.imread('depthxing.jpg'): 加载第二幅图像
-
提取特征点:
feature_coords1 = harris_corner_detection(image1): 提取第一幅图像的 Harris 角点feature_coords2 = harris_corner_detection(image2): 提取第二幅图像的 Harris 角点
-
转换图像数据类型:
image1 = img_as_float(image1): 将第一幅图像的数据类型转换为浮点数image2 = img_as_float(image2): 将第二幅图像的数据类型转换为浮点数
-
提取 Daisy 描述符:
descriptor1 = extract_daisy_descriptor(image1): 提取第一幅图像的 Daisy 描述符descriptor2 = extract_daisy_descriptor(image2): 提取第二幅图像的 Daisy 描述符
-
匹配特征点:
matches = match_features(descriptor1, descriptor2): 匹配两幅图像的 Daisy 描述符
-
可视化匹配结果:
matched_image = cv2.drawMatches(image1, feature_coords1, image2, feature_coords2, matches[:10], None, flags=2): 将匹配结果可视化
-
显示匹配结果:
cv2.imshow('Matched Image', matched_image): 显示匹配结果图像cv2.waitKey(0): 等待用户按下任何键cv2.destroyAllWindows(): 关闭所有窗口
结论:
这段代码实现了使用 Harris 角点检测和 Daisy 描述符匹配来识别图像中的特征点,并使用 OpenCV 库来可视化匹配结果。该方法能够有效地识别图像中的特征点,并将其用于图像配准、目标识别等应用。
原文地址: https://www.cveoy.top/t/topic/se2 著作权归作者所有。请勿转载和采集!