004 Detección y coincidencia de puntos de características OpenCV akaze

Tabla de contenido

1. Medio ambiente

Segundo, algoritmo de puntos característicos de akaze

2.1 Principios básicos

2.2 Proceso de implementación

2.3 Aplicación práctica

2.4 Ventajas y desventajas

3. Código

3.1 Preparación de datos

3.2 Código completo


1. Medio ambiente

El entorno de uso de este artículo es:

  • windows10
  • Pitón 3.9.17
  • opencv-python 4.8.0.74

Segundo, algoritmo de puntos característicos de akaze

El algoritmo de detección de puntos característicos AKAZE es un algoritmo ampliamente utilizado en el campo del procesamiento de imágenes, que puede extraer puntos característicos de imágenes en diferentes escalas y tiene las ventajas de invariancia de escala e invariancia de rotación. Este artículo presentará brevemente los principios básicos, el proceso de implementación y el rendimiento del algoritmo AKAZE en aplicaciones prácticas.

2.1 Principios básicos

El algoritmo AKAZE se basa en la teoría del espacio de escala y la pirámide de imágenes, construye el espacio de escala mediante filtrado de difusión no lineal y detecta puntos clave en el espacio de escala. En AKAZE, la detección de puntos clave se logra mediante un proceso llamado "difusión no lineal acelerada", que puede generar rápidamente un espacio de escala. Además, AKAZE también utiliza el descriptor M-LDB para describir el área circundante del punto característico.

2.2 Proceso de implementación

  1. Preprocesamiento de imágenes: primero, preprocese la imagen de entrada, incluidas operaciones como escala de grises y reducción de ruido, para mejorar la precisión del algoritmo.
  2. Construya el espacio de escala: luego, construya el espacio de escala mediante filtrado de difusión no lineal y detecte puntos clave en el espacio de escala. En este proceso, se utiliza un método llamado "difusión no lineal acelerada", que puede generar rápidamente un espacio de escala.
  3. Detección de puntos clave: en el espacio de escala, se utiliza un método basado en regiones para detectar puntos clave. Estos puntos clave corresponden a puntos extremos locales en la imagen, es decir, que tienen el valor de gris máximo o mínimo en el área circundante.
  4. Generación de descriptores: después de detectar puntos clave, AKAZE utiliza descriptores M-LDB para describir las áreas circundantes de los puntos característicos. El descriptor M-LDB es un descriptor LDB mejorado que puede describir mejor las características de las imágenes.
  5. Coincidencia de características: finalmente, la coincidencia de características se realiza comparando descriptores M-LDB entre diferentes imágenes para identificar áreas similares en la imagen.

2.3 Aplicación práctica

El algoritmo AKAZE ha demostrado un buen rendimiento en aplicaciones prácticas y se puede aplicar a muchos campos, como reconocimiento de objetivos, registro de imágenes, unión, etc. Por ejemplo, en el reconocimiento de objetivos, AKAZE se puede utilizar para detectar puntos característicos del objetivo en imágenes e identificar objetos objetivo mediante la coincidencia de características. Además, AKAZE también se puede utilizar en el empalme de imágenes para lograr un empalme perfecto alineando puntos característicos en diferentes imágenes.

2.4 Ventajas y desventajas

El algoritmo AKAZE tiene las siguientes ventajas:

  1. Invariancia de escala: el algoritmo AKAZE puede extraer puntos característicos de imágenes en diferentes escalas, adaptándose así a imágenes de diferentes escalas.
  2. Invariancia de rotación: el algoritmo AKAZE tiene invariancia de rotación y puede extraer puntos característicos de imágenes en diferentes ángulos.
  3. Rendimiento de aceleración: en comparación con el algoritmo SIFT, el algoritmo AKAZE utiliza un método de difusión no lineal acelerada para construir el espacio de escala, que tiene una velocidad de ejecución más rápida.
  4. Robustez: el algoritmo AKAZE tiene una gran robustez al ruido y la interferencia y puede extraer puntos característicos más robustos.

Sin embargo, el algoritmo AKAZE también tiene algunas deficiencias:

  1. Sensible a los cambios de iluminación: el algoritmo AKAZE es más sensible a los cambios de iluminación y puede verse afectado por los cambios de iluminación.
  2. Sensible a los cambios locales: el algoritmo AKAZE es sensible a los cambios locales, lo que puede provocar detecciones falsas o detecciones perdidas.
  3. Requiere configuración manual de parámetros: el algoritmo AKAZE requiere configuración manual de algunos parámetros, como series espaciales de escala, número de iteraciones para acelerar la difusión no lineal, etc. La configuración de estos parámetros afectará el rendimiento y la precisión del algoritmo.

En resumen, el algoritmo de detección de puntos característicos AKAZE es un método eficaz de extracción de características de imagen con las ventajas de la invariancia de escala y la invariancia de rotación. Ha demostrado un buen rendimiento en aplicaciones prácticas y se puede aplicar a muchos campos. Sin embargo, también tiene algunas desventajas, como ser sensible a los cambios de iluminación, sensible a los cambios locales y requerir configuración manual de parámetros. El rendimiento y la precisión del algoritmo AKAZE se pueden mejorar y perfeccionar aún más en el futuro.

3. Código

3.1 Preparación de datos

El código requiere dos imágenes y un archivo en formato xml, a saber: H1to3p.xml, de la siguiente manera:

<?xml version="1.0"?>
<opencv_storage>
<H13 type_id="opencv-matrix">
  <rows>3</rows>
  <cols>3</cols>
  <dt>d</dt>
  <data>
	7.6285898e-01  -2.9922929e-01   2.2567123e+02
	3.3443473e-01   1.0143901e+00  -7.6999973e+01
	3.4663091e-04  -1.4364524e-05   1.0000000e+00 </data></H13>
</opencv_storage>

3.2 Código completo

Código:

from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
from math import sqrt

# 读取两张图片
parser = argparse.ArgumentParser(description='Code for AKAZE local features matching tutorial.')
parser.add_argument('--input1', help='Path to input image 1.', default='graf1.png') # 在这里设置图像1
parser.add_argument('--input2', help='Path to input image 2.', default='graf3.png') # 在这里设置图像2
parser.add_argument('--homography', help='Path to the homography matrix.', default='H1to3p.xml') # 在这里设置H矩阵
args = parser.parse_args()

img1 = cv.imread(cv.samples.findFile(args.input1), cv.IMREAD_GRAYSCALE)
img2 = cv.imread(cv.samples.findFile(args.input2), cv.IMREAD_GRAYSCALE)
if img1 is None or img2 is None:
    print('Could not open or find the images!')
    exit(0)
fs = cv.FileStorage(cv.samples.findFile(args.homography), cv.FILE_STORAGE_READ)
homography = fs.getFirstTopLevelNode().mat()

## 初始化算法[AKAZE]
akaze = cv.AKAZE_create()
# 检测图像1和图像2的特征点和特征向量
kpts1, desc1 = akaze.detectAndCompute(img1, None)
kpts2, desc2 = akaze.detectAndCompute(img2, None)

## 基于汉明距离,使用暴力匹配来匹配特征点
matcher = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE_HAMMING)
nn_matches = matcher.knnMatch(desc1, desc2, 2)

## 下面0.8默认参数,可以手动修改、调试
matched1 = []
matched2 = []
nn_match_ratio = 0.8 # 最近邻匹配参数
for m, n in nn_matches:
    if m.distance < nn_match_ratio * n.distance:
        matched1.append(kpts1[m.queryIdx])
        matched2.append(kpts2[m.trainIdx])

## 使用单应矩阵进行精匹配,进一步剔除误匹配点
inliers1 = []
inliers2 = []
good_matches = []
inlier_threshold = 2.5 # 如果两个点距离小于这个值,表明足够近,也就是一对匹配对
for i, m in enumerate(matched1):
    col = np.ones((3,1), dtype=np.float64)
    col[0:2,0] = m.pt

    col = np.dot(homography, col)
    col /= col[2,0]
    dist = sqrt(pow(col[0,0] - matched2[i].pt[0], 2) +\
                pow(col[1,0] - matched2[i].pt[1], 2))

    if dist < inlier_threshold:
        good_matches.append(cv.DMatch(len(inliers1), len(inliers2), 0))
        inliers1.append(matched1[i])
        inliers2.append(matched2[i])

## 可视化
res = np.empty((max(img1.shape[0], img2.shape[0]), img1.shape[1]+img2.shape[1], 3), dtype=np.uint8)
cv.drawMatches(img1, inliers1, img2, inliers2, good_matches, res)
cv.imwrite("akaze_result.png", res)

inlier_ratio = len(inliers1) / float(len(matched1))
print('A-KAZE Matching Results')
print('*******************************')
print('# Keypoints 1:                        \t', len(kpts1))
print('# Keypoints 2:                        \t', len(kpts2))
print('# Matches:                            \t', len(matched1))
print('# Inliers:                            \t', len(inliers1))
print('# Inliers Ratio:                      \t', inlier_ratio)

cv.imshow('result', res)
cv.waitKey()

Supongo que te gusta

Origin blog.csdn.net/m0_72734364/article/details/134468628
Recomendado
Clasificación