栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

计算机视觉——局部图像描述子

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算机视觉——局部图像描述子

目录

一:Harris角点检测器

1.1角点的解释

1.2Harris角点检测基本思想

1.3harris检测:数学表达

 1.4代码部分

二:SIFT

2.1.SIFT介绍

2.2 SIFT算法实现步骤简述

2.3 关键点检测

 2.4 关键点检测——DOG

2.5关键点方向分配

2.6关键点匹配

 2.7代码部分


一:Harris角点检测器

1.1角点的解释

角点是一阶导数(即灰度的梯度)的局部最大所对应的像素点;也是两条及两条以上边缘的交点。角点指示了物体边缘变化不连续的方向,角点处的一阶导数最大,二阶导数为0。角点是指图像中梯度值和梯度方向的变化速率都很高的点。下图为不同类型的角点:

1.2Harris角点检测基本思想

角点定义 <- 窗口向任意方向的移动都导致图像灰度的明 显变化

从图像局部的小窗口观察图像特征:

1.3harris检测:数学表达

将图像窗口平移[u,v]产生灰度变化E(u,v)

有泰勒公式展开可得:(Ix,Iy 分别为偏导数,在图像中为图像的方向导数)

I(x+u,y+v)=I(x,y)+Ix∗u+Iy∗v+O(u^2,v^2)

E(u,v)=sum[w(x,y)[Ix∗u+Iy∗v+O(u^2,v^2)]^2]

可以近似得到:E(u,v)=sum[w(x,y)[Ix∗u+Iy∗v]^2]

即

 令

因此最后对角点的检测成了对矩阵M的特征值的分析了,令M其特征值为x1,x2

当x1>>x2或者x2>>x1,则检测到的是边缘部分

当x1,x2都很小,图像窗口在所有移动的方向上移动灰度级都无明显变化.

当X1,X2都很大时且相当,检测到的是角点

 1.4代码部分
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters

def compute_harris_response(im, sigma=3):

    #计算x方向的导数
    imx = zeros(im.shape) #zeros()生成全零数组
    filters.gaussian_filter(im, (sigma,sigma),(0,1),imx)

    #计算x方向的导数
    imy = zeros(im.shape) #zeros()生成全零数组
    filters.gaussian_filter(im, (sigma,sigma),(0,1),imy)

    #计算harris矩阵的分量
    Wxx = filters.gaussian_filter(imx*imx,sigma)
    Wxy = filters.gaussian_filter(imx*imy,sigma)
    Wyy = filters.gaussian_filter(imy*imy,sigma)

    #计算特征值和迹
    Wdet = Wxx*Wyy - Wxy*2
    Wtr = Wxx + Wyy

    return Wdet / Wtr

#获取角点
def get_harris_points(harrism, min_dist=10, threshold=0.1):
    """从一幅Harris响应图像中返回角点。min_dist为分割角点和图像边界的最少像素数目"""

    #寻找高于阈值的候选角点
    corner_threshold = harrism.max()*threshold
    harrisim_t = (harrisim > corner_threshold) * 1

    #得到候选点的坐标
    coords = array(harrisim_t.nonzero()).T

    #以及它们的Harris响应值
    candidate_values = [harrism[c[0],c[1]] for c in coords]

    #对侯选点按照Harris响应值进行排序
    index = argsort(candidate_values)

    #将可行点的位置保存到数组中
    allowed_locations = zeros(harrism.shape)
    allowed_locations[min_dist:-min_dist,min_dist:-min_dist]=1

    #按照min_distance 原则,选择最佳Harris点
    filtered_coords = []
    for i in index:
        if allowed_locations[coords[i,0],coords[i,1]] == 1:
            filtered_coords.append(coords[i])
            allowed_locations[(coords[i,0]-min_dist):(coords[i,0]+min_dist),(coords[i,1]-min_dist):(coords[i,1] + min_dist)] = 0

    return filtered_coords

def plot_harris_points(image, filtered_coords):
    """绘制图像中检测到的角点"""
    figure()
    gray()
    imshow(image)
    plot([p[1] for p in filtered_coords],[p[0] for p in filtered_coords], '*')
    axis('off')
    show()

if __name__ == "__main__":

    im = array(Image.open("D:\图片\tu\1.jpg").convert("L"))
    imshow(im)
    harrisim = compute_harris_response(im)
    filtered_coords = get_harris_points(harrisim,6)
    plot_harris_points(im, filtered_coords)

 

二:SIFT

2.1.SIFT介绍

        SIFT又称为尺度不变特征变换,是一种电脑视觉的算法用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。

SIFT算法可以解决的问题:

1.目标的旋转、缩放、平移        2.图像仿射/投影变换         3.弱光照影响

4.部分目标遮挡        5.杂物场景        6.噪声

2.2 SIFT算法实现步骤简述

 SIFT算法实现特征匹配主要有三个流程,1、提取关键点;2、对关键点附加 详细的信息(局部特征),即描述符;3、通过特征点(附带上特征向量的关 键点)的两两比较找出相互匹配的若干对特征点,建立景物间的对应关系。

2.3 关键点检测

       1. SIFT中要查找的关键点一般为角点、边缘点、暗区域的亮点以及亮区域的暗点。假定两幅图像中 有相同的景物,那么使用某种算法分别提取各自的特征点,这些点之间会有 相互对应的匹配关系

        2.尺度空间主要思想是通过对原 始图像进行尺度变换,获得图像多尺度下的空间表示。从而实 现边缘、角点检测和不同分辨率上的特征提取,以满足特征点 的尺度不变性。尺度空间中各尺度图像的模 糊程度逐渐变大,能够模拟人在 距离目标由近到远时目标在视网 膜上的形成过程。 尺度越大图像越模糊。

        3. 高斯模糊:高斯模糊是在Adobe Photoshop等图像处理软件中广泛使用的处理 效果,通常用它来减小图像噪声以及降低细节层次。这种模糊技术生成 的图像的视觉效果是好像经过一个半透明的屏幕观察图像。

 

 2.4 关键点检测——DOG

DoG(Difference of Gaussian)函数:

DoG高斯差分金字塔:对应DOG算子,需构建DOG金字塔

可以通过高斯差分图像 看出图像上的像素值变 化情况。(如果没有变 化,也就没有特征。特 征必须是变化尽可能多 的点。)DOG图像描 绘的是目标的轮廓。

 

 DoG的局部极值点:特征点是由DOG空间的局部极值点组成的。为了寻找DoG函数的极值点, 每一个像素点要和它所有的相邻点比较,看其是否比它的图像域和尺度域 的相邻点大或者小。中间的检测点和它同尺度的8个相邻点和上下相邻尺度对应的9×2个 点共26个点比较,以确保在尺度空间和二维图像空间都检测到极值点。

2.5关键点方向分配

        通过尺度不变性求极值点,可以使其具有缩放不变的性质。而利用关 键点邻域像素的梯度方向分布特性,可以为每个关键点指定方向参数方向, 从而使描述子对图像旋转具有不变性。

像素点的梯度表示:

方向直方图的生成:确定关键点的方向采用梯度直方图统计法, 统计以关键点为原点,一定区域内的图像像 素点对关键点方向生成所作的贡献。

 

关键点的主方向与辅方向:

关键点主方向:极值点周围区域梯度直方图的主峰值也是特征点方向

关键点辅方向:在梯度方向直方图中,当存在另一个相当于主峰值 80%能量的峰值时,则将这个方向认为是该关键点的辅方向。

这可以增强匹配的鲁棒性,Lowe的论文指出大概有15%关键点具有 多方向,但这些点对匹配的稳定性至为关键 

 

2.6关键点匹配

        分别对模板图(参考图,reference image)和实时图(观测图, observation image)建立关键点描述子集合。目标的识别是通过两点 集内关键点描述子的比对来完成。具有128维的关键点描述子的相似 性度量采用欧式距离。

        关键点的匹配可以采用穷举法来完成,但是这样耗费的时间太 多,一般都采用kd树的数据结构来完成搜索。搜索的内容是以 目标图像的关键点为基准,搜索与目标图像的特征点最邻近的 原图像特征点和次邻近的原图像特征点。

 2.7代码部分
import numpy as np
import cv2
from matplotlib import pyplot as plt

imgname1 = 'D:\图片\tu\2.jpg'
imgname2 = 'D:\图片\tu\3.jpg'

sift = cv2.xfeatures2d.SIFT_create()

img1 = cv2.imread(imgname1)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) #灰度处理图像
kp1, des1 = sift.detectAndCompute(img1,None)   #des是描述子

img2 = cv2.imread(imgname2)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)#灰度处理图像
kp2, des2 = sift.detectAndCompute(img2,None)  #des是描述子

hmerge = np.hstack((gray1, gray2)) #水平拼接
cv2.imshow("gray", hmerge) #拼接显示为gray
cv2.waitKey(0)

img3 = cv2.drawKeypoints(img1,kp1,img1,color=(255,0,255)) #画出特征点,并显示为红色圆圈
img4 = cv2.drawKeypoints(img2,kp2,img2,color=(255,0,255)) #画出特征点,并显示为红色圆圈
hmerge = np.hstack((img3, img4)) #水平拼接
cv2.imshow("point", hmerge) #拼接显示为gray
cv2.waitKey(0)
# BFMatcher解决匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1,des2, k=2)
# 调整ratio
good = []
for m,n in matches:
    if m.distance < 0.75*n.distance:
        good.append([m])

img5 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,flags=2)
cv2.imshow("BFmatch", img5)
cv2.waitKey(0)
cv2.destroyAllWindows()

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960957.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号