IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 计算机视觉二 局部图像描述子 SIFT算法 -> 正文阅读

[人工智能]计算机视觉二 局部图像描述子 SIFT算法

目录

一.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 FontProperties

font = 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 FontProperties

font = 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 pydot

import 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..匹配地理标记图像运行结果:

匹配案例:

?

匹配结果:

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章           查看所有文章
加:2022-04-01 23:22:47  更:2022-04-01 23:27:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/8 4:48:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码