角点检测
- 1.分别实现Harris角点检测与SIFT特征提取,对比两者的区别
- 1.1代码实现
- 1.2两者区别
- 2.利用SIFT算法实现两幅相近图像的特征匹配
- 2.1代码实现
- 3.实现匹配地理标记图像
- 3.1代码实现
- 4.实验注意事项
- 4.1实验需要安装的库和应用
- 4.2报错内容
- 5.小结
1.分别实现Harris角点检测与SIFT特征提取,对比两者的区别
1.1代码实现
Harris角点检测
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\ice-bg\Desktop\a\right.jpg')
gray = np.float32(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY))
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
dst = cv2.dilate(dst, None)
img[dst > 0.01 * dst.max()] = [0, 0, 255]
cv2.imshow('dst', img)
cv2.waitKey(0) & 0xff == 27 and cv2.destroyAllWindows()
运行结果
SIFT特征提取
# Import necessary libraries
import cv2
import numpy as np
# Load the image
img = cv2.imread('left.jpg')
# Convert the image to grayscale
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# SIFT feature extraction
# Define the SIFT object
sift = cv2.SIFT_create()
# Detect and compute SIFT features
kp, des = sift.detectAndCompute(gray, None)
# Draw SIFT keypoints on the image
img_sift = cv2.drawKeypoints(img, kp, None)
# Display the image with SIFT keypoints
cv2.imshow('SIFT Keypoints', img_sift)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果
1.2两者区别
Harris角点检测和SIFT特征提取都是计算机视觉领域中常用的特征检测与描述算法。它们的主要区别在于:Harris角点检测是一种基于角点
的检测方法,而SIFT特征提取是一种基于局部特征
的描述方法。Harris角点检测适用于具有明显边缘
的图像,而SIFT特征提取能够提取出更加稳定和鲁棒的特征点,但计算时间较长
,不适用于实时性要求较高的场景。
2.利用SIFT算法实现两幅相近图像的特征匹配
2.1代码实现
import cv2
# 读取左右两张图片
left_img = cv2.imread('left.jpg')
right_img = cv2.imread('right.jpg')
# 创建SIFT对象
sift = cv2.SIFT_create()
# 检测关键点和计算描述符
left_kp, left_des = sift.detectAndCompute(left_img, None)
right_kp, right_des = sift.detectAndCompute(right_img, None)
# 创建BFMatcher对象
bf = cv2.BFMatcher()
# 匹配描述符
matches = bf.knnMatch(left_des, right_des, k=2)
# 应用比率测试
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append([m])
# 绘制匹配结果
result = cv2.drawMatchesKnn(left_img, left_kp, right_img, right_kp, good_matches, None, flags=2)
# 显示结果
cv2.imshow('SIFT Matches', result)
cv2.waitKey(0)
运行结果
3.实现匹配地理标记图像
3.1代码实现
# -*- coding=utf-8 -*-
from pylab import *
from PIL import Image
from PCV.localdescriptors import sift
from PCV.tools import imtools
import pydot
from tqdm import tqdm
download_path = "C:\\Users\\ice-bg\\Desktop\\a\\img\\"
path = "C:\\Users\\ice-bg\\Desktop\\a\\img\\"
imlist = imtools.get_imlist(download_path)
featlist = [imname[:-3] + 'sift' for imname in imlist]
for i, imname in enumerate(imlist):
sift.process_image(imname, featlist[i])
matchscores = zeros((len(imlist), len(imlist)))
for i in tqdm(range(len(imlist))):
for j in range(i, len(imlist)):
l1, d1 = sift.read_features_from_file(featlist[i])
l2, d2 = sift.read_features_from_file(featlist[j])
nbr_matches = sum(sift.match_twosided(d1, d2) > 0)
matchscores[i, j] = nbr_matches
for i in range(len(imlist)):
for j in range(i + 1, len(imlist)):
matchscores[j, i] = matchscores[i, j]
threshold = 2
g = pydot.Dot(graph_type='graph')
for i in tqdm(range(len(imlist))):
for j in range(i + 1, len(imlist)):
if matchscores[i, j] > threshold:
for k in range(2):
im = Image.open(imlist[i if k == 0 else j])
im.thumbnail((100, 100))
filename = path + str(i if k == 0 else j) + '.png'
im.save(filename)
g.add_node(pydot.Node(str(i if k == 0 else j), fontcolor='transparent', shape='rectangle', image=filename))
g.add_edge(pydot.Edge(str(i), str(j)))
g.write_png('jmu.png')
运行结果
4.实验注意事项
4.1实验需要安装的库和应用
-
GraphViz
在安装时最好勾选自动添加环境变量,就不用手动配置环境变量。如若忘记勾选还要找到安装路径文件夹,找到dot文件,将它的路径添加到系统环境变量path中。成功安装后在命令行输入dot -version
,查看graphviz是否安装成功。
-
安装python库
直接在命令行使用pip安装相应工具包。
pip install graphviz
pip install pydot
4.2报错内容
- sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
参考该博客:sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
PS:如果是conda或其他虚拟环境建议用ctrl点击调用的函数(process_image)去到对应的函数里修改
。否则你可能会出现明明和他一样的修改却没有用。 - IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
参考该博客:vlfeat0.9.21提取sift特征为空 - vlfeat0.9.21提取sift特征为空
这个和上一个解决方式一样。
参考该博客:vlfeat0.9.21提取sift特征为空
5.小结
本次实验实现了Harris角点检测与SIFT特征提取,并对比了两者的区别。利用SIFT算法实现了两幅相近图像的特征匹配,并成功实现了匹配地理标记图像。