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.jpgimage2.jpg为您要使用的图像文件的路径。这段代码将使用Harris角点检测提取特征点,并使用DAISY描述符描述特征点。然后,使用最近邻匹配算法匹配特征点,并显示匹配图像。

Python 图像特征匹配:Harris 角点检测与 DAISY 描述符

原文地址: https://www.cveoy.top/t/topic/skv 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录