当前位置: 首页 > article >正文

计算机视觉-角点检测

角点检测

  • 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报错内容

  1. sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    参考该博客:sift‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    PS:如果是conda或其他虚拟环境建议用ctrl点击调用的函数(process_image)去到对应的函数里修改。否则你可能会出现明明和他一样的修改却没有用。
  2. IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed
    参考该博客:vlfeat0.9.21提取sift特征为空
  3. vlfeat0.9.21提取sift特征为空
    这个和上一个解决方式一样。
    参考该博客:vlfeat0.9.21提取sift特征为空

5.小结

本次实验实现了Harris角点检测与SIFT特征提取,并对比了两者的区别。利用SIFT算法实现了两幅相近图像的特征匹配,并成功实现了匹配地理标记图像。


http://www.kler.cn/a/14836.html

相关文章:

  • 【MySQL高级】——目录结构数据库和文件系统的关系
  • MySQL数据库——MySQL LIMIT:限制查询结果的条数
  • 离散数学组合计数
  • DevOps 与研发效能专家张乐:研发效能的升维思考与降维执行
  • java每日问题
  • m4a怎么转换成mp3,4招搞定
  • 2023年全国最新道路运输从业人员精选真题及答案61
  • 一文带你上高速入门linux(含常用命令语法、说明、举例)
  • 数据治理-数据质量篇
  • Nginx的优化及防盗链
  • 论文笔记:A Simple Framework for Contrastive Learning of Visual Representations
  • 第5章 if语句
  • C#使用异步的几种方法对比示例
  • 11. 图的入门
  • Web Service(三)—— SOAP学习
  • Linux进程层次分析
  • 【SWAT水文模型】ArcSWAT输入准备
  • 学会SpringBoot的第一天(超详细)
  • 案例01-tlias智能学习辅助系统02-文件上传
  • 基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)