Python 图像特征匹配:Harris 角点检测与 DAISY 描述符
import cv2
import numpy as np
from skimage.feature import daisy
from skimage.color import rgb2gray
from skimage import 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)
def extract_harris_corners(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, feature_coords):
gray = rgb2gray(image)
descriptors = []
for y, x in zip(*feature_coords):
descriptor = daisy(gray[y - R:y + R, x - R:x + R], step=E, radius=R, rings=Q, histograms=T, orientations=H)
descriptors.append(descriptor)
return descriptors
def match_features(descriptors1, descriptors2):
matches = []
for idx1, desc1 in enumerate(descriptors1):
best_match_idx = -1
best_distance = float('inf')
for idx2, desc2 in enumerate(descriptors2):
distance = np.linalg.norm(desc1 - desc2)
if distance < best_distance:
best_distance = distance
best_match_idx = idx2
matches.append((idx1, best_match_idx, best_distance))
matches.sort(key=lambda x: x[2])
return matches
# Load input images
image1 = cv2.imread('image1.jpg')
image2 = cv2.imread('image2.jpg')
# Extract Harris corners
feature_coords1 = extract_harris_corners(image1)
feature_coords2 = extract_harris_corners(image2)
# Convert image data to float
image1 = img_as_float(image1)
image2 = img_as_float(image2)
# Extract Daisy descriptors for feature points
descriptors1 = extract_daisy_descriptor(image1, feature_coords1)
descriptors2 = extract_daisy_descriptor(image2, feature_coords2)
# Match features
matches = match_features(descriptors1, descriptors2)
# 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()
请确保替换image1.jpg和image2.jpg为您要使用的图像文件的路径。这段代码将使用Harris角点检测提取特征点,并使用DAISY描述符描述特征点。然后,使用最近邻匹配算法匹配特征点,并显示匹配图像。
原文地址: https://www.cveoy.top/t/topic/skv 著作权归作者所有。请勿转载和采集!