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 函数将匹配结果可视化。

代码解释:

  1. 导入库:

    • cv2: OpenCV 库
    • numpy: 科学计算库
    • skimage.feature.daisy: Daisy 描述符库
    • skimage.color.rgb2gray: 图像灰度化库
    • skimage.img_as_ubyte, skimage.img_as_float: 图像数据类型转换库
  2. 定义参数:

    • R: Daisy 描述符的半径
    • E: Daisy 描述符的步长
    • Q: Daisy 描述符的层数
    • T: Daisy 描述符的直方图数量
    • H: Daisy 描述符的直方图 bin 数量
  3. 定义 Harris 角点检测函数:

    • harris_corner_detection(image): 输入图像,返回 Harris 角点坐标
    • 首先将图像转换为灰度图像
    • 使用 cv2.cornerHarris() 函数进行 Harris 角点检测
    • 使用 cv2.dilate() 函数膨胀角点,使其更明显
    • 使用阈值对角点进行筛选,返回大于阈值的角点坐标
  4. 定义 Daisy 描述符提取函数:

    • extract_daisy_descriptor(image): 输入图像,返回 Daisy 描述符
    • 首先将图像转换为灰度图像
    • 使用 daisy() 函数提取 Daisy 描述符
  5. 定义特征匹配函数:

    • match_features(descriptor1, descriptor2): 输入两个图像的 Daisy 描述符,返回匹配结果
    • 首先调整 Daisy 描述符的维度,使其成为一个一维向量
    • 使用最近邻匹配来找到两幅图像之间的匹配特征点
    • 将匹配结果按照距离从小到大排序,并返回匹配结果
  6. 加载图像:

    • image1 = cv2.imread('03751.jpg'): 加载第一幅图像
    • image2 = cv2.imread('depthxing.jpg'): 加载第二幅图像
  7. 提取特征点:

    • feature_coords1 = harris_corner_detection(image1): 提取第一幅图像的 Harris 角点
    • feature_coords2 = harris_corner_detection(image2): 提取第二幅图像的 Harris 角点
  8. 转换图像数据类型:

    • image1 = img_as_float(image1): 将第一幅图像的数据类型转换为浮点数
    • image2 = img_as_float(image2): 将第二幅图像的数据类型转换为浮点数
  9. 提取 Daisy 描述符:

    • descriptor1 = extract_daisy_descriptor(image1): 提取第一幅图像的 Daisy 描述符
    • descriptor2 = extract_daisy_descriptor(image2): 提取第二幅图像的 Daisy 描述符
  10. 匹配特征点:

    • matches = match_features(descriptor1, descriptor2): 匹配两幅图像的 Daisy 描述符
  11. 可视化匹配结果:

    • matched_image = cv2.drawMatches(image1, feature_coords1, image2, feature_coords2, matches[:10], None, flags=2): 将匹配结果可视化
  12. 显示匹配结果:

    • cv2.imshow('Matched Image', matched_image): 显示匹配结果图像
    • cv2.waitKey(0): 等待用户按下任何键
    • cv2.destroyAllWindows(): 关闭所有窗口

结论:

这段代码实现了使用 Harris 角点检测和 Daisy 描述符匹配来识别图像中的特征点,并使用 OpenCV 库来可视化匹配结果。该方法能够有效地识别图像中的特征点,并将其用于图像配准、目标识别等应用。


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

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