西安城市建设职业学院官方网站,网站的线下推广怎么做的,中国建设银行对公网站,创业平台的选择目录
一、环境
二、akaze特征点算法
2.1、基本原理
2.2、实现过程
2.3、实际应用
2.4、优点与不足
三、代码
3.1、数据准备
3.2、完整代码 一、环境
本文使用环境为#xff1a;
Windows10Python 3.9.17opencv-python 4.8.0.74
二、akaze特征点算法
特征点检测算法…目录
一、环境
二、akaze特征点算法
2.1、基本原理
2.2、实现过程
2.3、实际应用
2.4、优点与不足
三、代码
3.1、数据准备
3.2、完整代码 一、环境
本文使用环境为
Windows10Python 3.9.17opencv-python 4.8.0.74
二、akaze特征点算法
特征点检测算法AKAZE是一种广泛应用于图像处理领域的算法它可以在不同尺度下提取图像的特征点并具有尺度不变性和旋转不变性等优点。本文将概括介绍AKAZE算法的基本原理、实现过程以及其在实际应用中的表现。
2.1、基本原理
AKAZE算法是基于尺度空间理论和图像金字塔的它通过非线性扩散滤波来构建尺度空间并在尺度空间中检测关键点。在AKAZE中关键点的检测是通过一个称为“加速非线性扩散”的过程来实现的该过程可以快速地生成尺度空间。此外AKAZE还采用了M-LDB描述子来描述特征点的周围区域。
2.2、实现过程
图像预处理首先对输入图像进行预处理包括灰度化和降噪等操作以提高算法的准确性。构建尺度空间然后通过非线性扩散滤波来构建尺度空间并在尺度空间中检测关键点。在这个过程中采用了一种称为“加速非线性扩散”的方法该方法可以快速地生成尺度空间。关键点检测在尺度空间中采用基于区域的方法来检测关键点。这些关键点对应于图像中的局部极值点即在周围区域内具有最大或最小的灰度值。描述子生成在检测到关键点后AKAZE采用M-LDB描述子来描述特征点的周围区域。M-LDB描述子是一种改进的LDB描述子它可以更好地描述图像的特征。特征匹配最后通过比较不同图像之间的M-LDB描述子来进行特征匹配从而识别出图像中的相似区域。
2.3、实际应用
AKAZE算法在实际应用中表现出了良好的性能可以应用于许多领域如目标识别、图像配准、拼接等。例如在目标识别中AKAZE可以用于检测图像中的目标特征点并通过特征匹配来识别出目标物体。此外AKAZE还可以用于图像拼接中通过对齐不同图像中的特征点来实现无缝拼接。
2.4、优点与不足
AKAZE算法具有以下优点
尺度不变性AKAZE算法能够在不同尺度下提取图像的特征点从而适应了不同尺度的图像。旋转不变性AKAZE算法具有旋转不变性可以在不同角度下提取图像的特征点。加速性能与SIFT算法相比AKAZE算法采用了加速非线性扩散方法来构建尺度空间具有更快的运行速度。稳健性AKAZE算法对噪声和干扰具有较强的鲁棒性能够提取出较为稳健的特征点。
然而AKAZE算法也存在一些不足之处
对光照变化敏感AKAZE算法对光照变化较为敏感可能会受到光照变化的影响。对局部变化敏感AKAZE算法对局部变化较为敏感可能会导致误检或漏检。需要手动设置参数AKAZE算法需要手动设置一些参数如尺度空间级数、加速非线性扩散的迭代次数等。这些参数的设置会影响到算法的性能和准确性。
总之特征点检测算法AKAZE是一种有效的图像特征提取方法具有尺度不变性和旋转不变性等优点。在实际应用中表现出了良好的性能可以应用于许多领域。然而它也存在一些不足之处如对光照变化敏感、对局部变化敏感以及需要手动设置参数等。未来可以进一步改进和完善AKAZE算法的性能和准确性。
三、代码
3.1、数据准备
代码需要的两张图一个xml格式的文件即H1to3p.xml如下
?xml version1.0?
opencv_storage
H13 type_idopencv-matrixrows3/rowscols3/colsdtd/dtdata7.6285898e-01 -2.9922929e-01 2.2567123e023.3443473e-01 1.0143901e00 -7.6999973e013.4663091e-04 -1.4364524e-05 1.0000000e00 /data/H13
/opencv_storage3.2、完整代码 代码
from __future__ import print_function
import cv2 as cv
import numpy as np
import argparse
from math import sqrt# 读取两张图片
parser argparse.ArgumentParser(descriptionCode for AKAZE local features matching tutorial.)
parser.add_argument(--input1, helpPath to input image 1., defaultgraf1.png) # 在这里设置图像1
parser.add_argument(--input2, helpPath to input image 2., defaultgraf3.png) # 在这里设置图像2
parser.add_argument(--homography, helpPath to the homography matrix., defaultH1to3p.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), dtypenp.float64)col[0:2,0] m.ptcol 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), dtypenp.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()