目录
一.SIFT算法:
1.基本介绍:
SIFT算法可以解决的问题:
2.相关概念:
1.尺度空间理论:
2.高斯模糊:
3.高斯金字塔:
4.关键点检测——DOG:
5.关键点方向分配 :
6.关键点描述:
7.关键点匹配:
二.STFL算法的实现:
1.SIFT特征检测测试代码:
2.SIFT特征检测运行结果:
3.SIFT特征匹配测试代码:
4.SIFT特征匹配运行结果:
①第一组测试结果:?
②第二组测试结果:
③第三组测试结果:
5.匹配地理标记图像代码:
6..匹配地理标记图像运行结果:
一.SIFT算法:
1.基本介绍: 1999年 David G.Lowe 教授总结了基于特征不变技术的检测方法,在图像尺度空间基础上,提出了对图像缩放、旋转保持不变性的图像局部特征描述算子-SIFT(尺度不变特征变换),该算法在2004年完善。 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述。这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子。SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、微视角改变的容忍度也相当高。
算法流程:
文章图片
SIFT算法实现特征匹配主要有三个流程, 1、提取关键点;2、对关键点附加详细的信息(局部特征),即描述符;3、通过特征点(附带上特征向量的关 键点)的两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。 SIFT中要查找的关键点是一些十分突出的点,不会因光照、尺度、旋转等因素的改变而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。假定两幅图像中有相同的景物,那么使用某种算法分别提取各自的特征点,这些点之间会有相互对应的匹配关系。
SIFT算法可以解决的问题:
(1)目标的旋转、缩放、平移;
(2)图像仿射或投影变换;
(3)弱光照影响以及部分目标遮挡;
(4)杂物场景以及噪声点影响。
2.相关概念: 在了解SIFT算法前,我们需要先了解以下概念:
1.尺度空间理论:
尺度空间理论最早于1962年提出,其主要思想是通过对原始图像进行尺度变换,获得图像多尺度下的空间表示。从而实现边缘、角点检测和不同分辨率上的特征提取,以满足特征点的尺度不变性。关键点检测的相关概念尺度空间中各尺度图像的模 糊程度逐渐变大,能够模拟人在 距离目标由近到远时目标在视网 膜上的形成过程。 尺度越大图像越模糊。 2.高斯模糊:
高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成的图像的视觉效果是好像经过一个半透明的屏幕观察图像。
文章图片
3.高斯金字塔:
高斯金字塔的构建过程可分为两步:(1)对图像做高斯平滑;(2)对图像做降采样。 为了让尺度体现其连续性,在简单下采样的基础上加上了高斯滤波。一幅图像可以产生几组(octave) 图像,一组图像包括几层( interval)图像。
文章图片
文章图片
4.关键点检测——DOG:
文章图片
DoG高斯差分金字塔对应DOG算子,需构建DOG金字塔可以通过高斯差分图像看出图像上的像素值变 化情况。(如果没有变化,也就没有特征。特征必须是变化尽可能多的点。)DOG图像描绘的是目标的轮廓。
文章图片
文章图片
5.关键点方向分配 :
文章图片
6.关键点描述:
下图是一个SIFT 描述子事例。其中描述子由 2 × 2 × 8 维向量表征,也即是2 × 2 个 8 方向的方向直方图组成。左图的种子点由 8 × 8 单元组成。每一个小格 都代表了特征点邻域所在的尺度空间的一个像素,箭头方向代表了像素梯度方 向,箭头长度代表该像素的幅值。然后在 4 × 4 的窗口内计算 8 个方向的梯度方向 直方图。绘制每个梯度方向的累加可形成一个种子点,如右图所示:一个特征 点由 4 个种子点的信息所组成。
文章图片
7.关键点匹配:
分别对模板图(参考图, reference image )和实时图(观测图observation image )建立关键点描述子集合。目标的识别是通过两点 集内关键点描述子的比对来完成。具有 128 维的关键点描述子的相似性度量采用欧式距离。
文章图片
文章图片
文章图片
二.STFL算法的实现:
1.SIFT特征检测测试代码:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from PCV.localdescriptors import sift
from PCV.localdescriptors import harris# 添加中文字体支持
from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc", size=10)imname = 'jmu.jpg'# 以灰度图的方式读入图片
im = np.array(Image.open(imname).convert('L'))
# 引用sift.py中的process_image将图像文件转化为pgm格式
sift.process_image(imname, 'jmu.sift')
# l1为兴趣点坐标、尺度和方位角度,d1是对应描述符的128 维向量
l1, d1 = sift.read_features_from_file('jmu.sift')plt.figure()
plt.gray()
plt.subplot(131)
plt.imshow(im, cmap='gray')
plt.axis('off')
plt.title(u'原图像', fontproperties=font)plt.subplot(132)
sift.plot_features(im, l1, circle=False)
plt.title(u'SIFT特征', fontproperties=font)plt.subplot(133)
sift.plot_features(im, l1, circle=True)
plt.title(u'圆圈表示特征尺度的SIFT特征', fontproperties=font)plt.show()
2.SIFT特征检测运行结果:
文章图片
3.SIFT特征匹配测试代码:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
import sys
from PCV.localdescriptors import sift# 添加中文字体支持
from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r"C:\Windows\Fonts\simsun.ttc", size=14)im1path = 'D:/image inform/3333/22121.png'
im2path = 'D:/image inform/3333/25.png'im1 = np.array(Image.open(im1path))
im2 = np.array(Image.open(im2path))sift.process_image(im1path, 'out_sift_ZS2.txt')
l1, d1 = sift.read_features_from_file('out_sift_ZS2.txt')
plt.figure()
plt.gray()
plt.subplot(121)
sift.plot_features(im1, l1, circle=False)
plt.title(u'第一幅图SIFT特征', fontproperties=font)sift.process_image(im2path, 'out_sift_ZS1.txt')
l2, d2 = sift.read_features_from_file('out_sift_ZS1.txt')
plt.subplot(122)
sift.plot_features(im2, l2, circle=False)
plt.title(u'第二幅图SIFT特征', fontproperties=font)# 输出两张图像的匹配度
matches = sift.match_twosided(d1, d2)
print('{} matches'.format(len(matches.nonzero()[0])))plt.figure()
plt.gray()
sift.plot_matches(im1, im2, l1, l2, matches, show_below=True)
plt.show()
4.SIFT特征匹配运行结果: ①第一组测试结果:
文章图片
文章图片
②第二组测试结果:
文章图片
文章图片
③第三组测试结果:
文章图片
文章图片
5.匹配地理标记图像代码:
# -*- coding: utf-8 -*-
# from pylab import *
import numpy as np
from PIL import Image
from PCV.localdescriptors import sift
import pydotimport os
def get_imlist(path):
return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]# 将其设置为存储图像的路径
download_path = "D:\image inform/3333"
# 保存缩略图的路径(pydot需要完整的系统路径)
path = "D:\\image inform\\tjw"# 下载的文件名列表
imlist = get_imlist(download_path)
nbr_images = len(imlist)# 提取特征
featlist = [imname[:-3] + 'sift' for imname in imlist]
for i, imname in enumerate(imlist):
sift.process_image(imname, featlist[i])matchscores = np.zeros((nbr_images, nbr_images))for i in range(nbr_images):
for j in range(i, nbr_images):# 仅仅计算上三角
print('comparing ', imlist[i], imlist[j])
l1, d1 = sift.read_features_from_file(featlist[i])
l2, d2 = sift.read_features_from_file(featlist[j])
matches = sift.match_twosided(d1, d2)
nbr_matches = sum(matches > 0)
print('number of matches = ', nbr_matches)
matchscores[i, j] = nbr_matches
print("The match scores is: \n", matchscores)# 复制值
for i in range(nbr_images):
for j in range(i + 1, nbr_images):# 无需复制对角线
matchscores[j, i] = matchscores[i, j]# 可视化
threshold = 2# 创建关联所需的最小匹配数目g = pydot.Dot(graph_type='graph')# 不使用默认的有向图for i in range(nbr_images):
for j in range(i + 1, nbr_images):
if matchscores[i, j] > threshold:
# 图像对中的第一幅图像
im = Image.open(imlist[i])
im.thumbnail((200, 200))
filename = path + str(i) + '.png'
im.save(filename)# 需要大小合适的临时文件
g.add_node(pydot.Node(str(i), fontcolor='transparent', shape='rectangle', image=filename))# 图像对中的第一幅图像
im = Image.open(imlist[j])
im.thumbnail((200, 200))
filename = path + str(j) + '.png'
im.save(filename)# 需要大小合适的临时文件
g.add_node(pydot.Node(str(j), fontcolor='transparent', shape='rectangle', image=filename))
g.add_edge(pydot.Edge(str(i), str(j)))
g.write_jpg('jmu.jpg')
print('结束')
6..匹配地理标记图像运行结果: 匹配案例:
文章图片
匹配结果:
文章图片
【计算机视觉二 局部图像描述子 SIFT算法】
推荐阅读
- python|【计算机视觉】局部图像描述子(Harris角点检测及匹配)
- 算法|【机器学习】基于Logistic Regression的新冠肺炎CT影像识别
- opencv|python-opencv给图像添加高斯噪声
- 计算机视觉|基于聚类的图像分割-Python
- Python 懂车帝全车系销量排行榜
- python 一行命令开启网络间的文件共享
- pycharm 添加已存在的 pipenv 虚拟环境解释器()
- java|争分夺秒!这所211大学调剂系统只开通14小时!
- 《Linux运维实战总结》|《Linux运维实战(shell脚本解析yaml文件变量》)