1. 程式人生 > >OpenCv學習筆記10--尺度不變特徵(SIFT)

OpenCv學習筆記10--尺度不變特徵(SIFT)

此opencv系列部落格只是為了記錄本人對<<opencv3計算機視覺-pyhton語言實現>>的學習筆記,所有程式碼在我的github主頁https://github.com/RenDong3/OpenCV_Notes.

歡迎star,不定時更新...

上一節中,我們介紹了Harris角點檢測。角點在影象旋轉的情況下也可以檢測到,但是如果減小(或者增加)影象的大小,可能會丟失影象的某些部分,甚至導致檢測到的角點發生改變。這樣的損失現象需要一種與影象比例無關的角點檢測方法來解決。尺度不變特徵變換(Scale-Invariant Feature Transform,SIFT)可以解決這個問題

。我們使用一個變換來進行特徵變換,並且該變換會對不同的影象尺度輸出相同的結果。

到底什麼是SIFT演算法?通俗一點說,SIFT演算法利用DoG(差分高斯)來提取關鍵點(或者說成特徵點),DoG的思想是用不同的尺度空間因子(高斯正態分佈的標準差σσ)對影象進行平滑,然後比較平滑後圖像的區別,差別大的畫素就是特徵明顯的點,即可能是特徵點。對得到的所有特徵點,我們剔除一些不好的,SIFT運算元會把剩下的每個特徵點用一個128維的特徵向量進行描述

由上,易知,一幅影象經過SIFT演算法後可以表示為一個128維的特徵向量集

SIFT具有一下特徵:

  • SIFT特徵,對旋轉、尺度縮放、亮度變化等保持不變性,對視角變換、仿射變化、噪聲也保持一定程度的穩定性,是一種非常優秀的區域性特徵描述演算法;
  • 獨特性好,資訊量豐富,適用於海量特徵庫進行快速、準確的匹配;
  • 多量性,即使是很少幾個物體也可以產生大量的SIFT特徵;
  • 高速性,經優化的SIFT匹配演算法甚至可以達到實時性的要求;
  • 擴充套件性,可以很方便的與其他的特徵向量進行聯合。

一 使用DoG和SIFT進行特徵提取和描述

我們先用OpenCV庫函式演示一下DoG和SIFT特徵提取的效果,然後再來講述一下SIFT的原理。

我們先來介紹一下Different of Gaussians(DoG),DoG是對同一圖象使用不同高斯濾波器作差所得到的結果。DoG操作的最終結果會得到感興趣的區域(關鍵點),這將通過SIFT來進行特徵描述。

我們來看看如何通過SIFT得到充滿角點和特徵的影象:

# -*- coding:utf-8 -*-
import os
import cv2
import numpy as np

'''
        created on 08:05:10 2018-11-20
        @author ren_dong

        使用DoG和SIFT進行特徵提取和描述

        cv2.SIFT.detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) → keypoints, descriptors
        
        cv2.drawKeypoints(image, keypoints[, outImage[, color[, flags]]]) → outImage
        
        首先建立了一個SIFT物件,SIFT物件會使用DoG檢測關鍵點,並且對每個關鍵點周圍區域計算特徵向量。
        detectAndCompute()函式會返回關鍵點資訊(每一個元素都是一個物件,有興趣的可以看一下OpenCV原始碼)和關鍵點的描述符。
        然後,我們在影象上繪製關鍵點,並顯示出來。

'''
img = cv2.imread('chess.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#建立sift物件
sift = cv2.xfeatures2d.SIFT_create()

#進行檢測和計算  返回特徵點資訊和描述符
keypoints , descriptor = sift.detectAndCompute(gray, None)
#keypoints:特徵點集合list,向量內每一個元素是一個KeyPoint物件,包含了特徵點的各種屬性資訊;



#繪製關鍵點
img = cv2.drawKeypoints(img, keypoints=keypoints, outImage=img, color= (51, 163, 236), flags= cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

#sift得到的影象為128維的特徵向量集

print len(keypoints)
print descriptor.shape

cv2.imshow('sift_keypoints',img)
cv2.waitKey()
cv2.destroyAllWindows()

我們首先建立了一個SIFT物件,SIFT物件會使用DoG檢測關鍵點,並且對每個關鍵點周圍區域計算特徵向量。detectAndCompute()函式會返回關鍵點資訊(每一個元素都是一個物件,有興趣的可以看一下OpenCV原始碼)和關鍵點的描述符。然後,我們在影象上繪製關鍵點,並顯示出來。

 上面我們用到了一個函式,下面來介紹一下:

1cv2.drawKeypoints(image, keypoints[, outImage[, color[, flags]]]) → outImage

 引數描述:

image:原始影象,可以使三通道或單通道影象;

keypoints:特徵點集合list,向量內每一個元素是一個KeyPoint物件,包含了特徵點的各種屬性資訊;

outImage:特徵點繪製的畫布影象,可以是原影象;

color:顏色設定,繪製的特徵點的顏色資訊,預設繪製的是隨機彩色;

flags:特徵點的繪製模式,其實就是設定特徵點的哪些資訊需要繪製,哪些不需要繪製,有以下幾種模式可選:

  •  cv2.DRAW_MATCHES_FLAGS_DEFAULT:建立輸出影象矩陣,使用現存的輸出影象繪製匹配對和特徵點,對每一個關鍵點只繪製中間點;
  • cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:不建立輸出影象矩陣,而是在輸出影象上繪製匹配對;
  • cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:對每一個特徵點繪製帶大小和方向的關鍵點圖形;
  • cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS:單點的特徵點不被繪製;

我們傳入了DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS標誌位,表明對影象每個關鍵點都繪製圓圈(大小)和方向。

總結下就是SIFT演算法利用DOG進行特徵點檢測,然後對每個關鍵點周圍的區域計算特徵向量.解決了Harris角點檢測的尺度變化影響問題.

這裡並沒有對SIFT演算法的原理進行詳細介紹,對此感興趣的同學可以去大神的部落格瀏覽觀看,裡面講的非常詳細,下面給上鍊接:

相關推薦

OpenCv學習筆記10--尺度特徵(SIFT)

此opencv系列部落格只是為了記錄本人對<<opencv3計算機視覺-pyhton語言實現>>的學習筆記,所有程式碼在我的github主頁https://github.com/RenDong3/OpenCV_Notes. 歡迎star,不定時更新.

第十二節、尺度特徵(SIFT)

上一節中,我們介紹了Harris角點檢測。角點在影象旋轉的情況下也可以檢測到,但是如果減小(或者增加)影象的大小,可能會丟失影象的某些部分,甚至導致檢測到的角點發生改變。這樣的損失現象需要一種與影象比例無關的角點檢測方法來解決。尺度不變特徵變換(Scale-Invariant Feature Transfor

[機器視覺] SIFT特徵-尺度特徵理解

SIFT特徵-尺度不變特徵理解 簡介 SIFT,即尺度不變特徵變換(Scale-invariant feature transform,SIFT),是用於影象處理領域的一種描述。這種描述具有尺度不變性,可在影象中檢測出關鍵點,是一種區域性特徵描述子。該方法於1999年由David Lowe首先發表於計算機

OpenCV學習筆記】之影象輪廓特徵與影象的矩

轉載: https://blog.csdn.net/zhu_hongji/article/details/81699736   一、影象的輪廓(Contours of Image)        輪廓可以說是一個很好的影象目標的

SIFT尺度特徵轉換

1、SIFT綜述 尺度不變特徵轉換(Scale-invariant feature transform或SIFT)是一種電腦視覺的演算法用來偵測與描述影像中的區域性性特徵,它在空間尺度中尋找極值點,並提取出其位置、尺度、旋轉不變數,此演算法由 David Lowe在1999年所發表,2004年完善

尺度特徵變換匹配演算法詳解Scale Invariant Feature Transform(SIFT)

 對於初學者,從David G.Lowe的論文到實現,有許多鴻溝,本文幫你跨越。 如果你學習SIFI得目的是為了做檢索,也許OpenSSE更適合你,歡迎使用。 1、SIFT綜述 尺度不變特徵轉換(Scale-invariant feature transform

SEPC:使用3D卷積從FPN中提取尺度特徵,漲點神器 | CVPR 2020

> 論文提出PConv為對特徵金字塔進行3D卷積,配合特定的iBN進行正則化,能夠有效地融合尺度間的內在關係,另外,論文提出SEPC,使用可變形卷積來適應實際特徵間對應的不規律性,保持尺度均衡。PConv和SEPC對SOTA的檢測演算法有顯著地提升 ,並且沒有帶來過多的額外計算量   來源:曉飛的

學習筆記SIFT尺度特征 (配合UCF-CRCV課程視頻)

rri cnblogs -o mask 畫出 blocks http ucf 產生 SIFT尺度不變特征 D. Lowe. Distinctive image features from scale-invariant key points, IJCV 2004 -Lect

OpenCV學習筆記(30)KAZE 演算法原理與原始碼分析(四)KAZE特徵的效能分析與比較

      KAZE系列筆記: 1.  OpenCV學習筆記(27)KAZE 演算法原理與原始碼分析(一)非線性擴散濾波 2.  OpenCV學習筆記(28)KAZE 演算法原理與原始碼分析(二)非線性尺度空間構

opencv學習筆記二十九:SIFT特徵點檢測與匹配

SIFT(Scale-invariant feature transform)是一種檢測區域性特徵的演算法,該演算法通過求一幅圖中的特徵點(interest points,or corner points)及其有關scale 和 orientation 的描述子得到特徵並進行

opencv學習筆記三十二:Haar特徵與積分影象

一、 Haar特徵定義         Haar特徵是基於“塊”的特徵,也被稱為矩形特徵。Haar特徵(模板)分為三類:邊緣特徵、線性特徵、中心特徵和對角線特徵。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值為白色矩形畫素和減去黑色矩形畫素和。Haar特徵值反映了影象

opencv學習筆記三十六:AKAZE特徵點檢測與匹配

KAZE是日語音譯過來的 , KAZE與SIFT、SURF最大的區別在於構造尺度空間,KAZE是利用非線性方式構造,得到的關鍵點也就更準確(尺度不變性 ); Hessian矩陣特徵點檢測 ,方向指定,基於一階微分影象(旋轉不變性 ) ; 描述子生成 ,歸一化處理(光照不變

Opencv學習筆記(1)---------Codeblocks執行按鈕

水母魚要學opencv了,決定把自己遇到的一些問題記錄下來,就當做一個勉勵吧,也幫大家少走一點彎路。 一遇見問題 今天水母魚就遇見了一個問題,發現有時候Codeblocks執行之後因為錯誤卡住了,生成和執行按鈕全部灰掉, 點執行會顯示編譯器還在執行中,直接關閉codeb

OpenCV學習筆記——用haar特徵訓練自己的分類器(再做手勢檢測)

資料還是得看啊,又讀了經典文獻《Robust Real-Time Face Detection》,不願意讀原文的朋友可以看看http://blog.csdn.net/hqw7286/article/details/5556767,作者把文中的要點基本也都總結出來了。Ope

OpenCV學習筆記】三十七、特徵檢測與匹配(二)——SIFT特徵點匹配

特徵檢測與匹配(二)——SIFT特徵點匹配 1.SIFT特徵點提取 2.繪製特徵點 3.特徵點描述符(特徵向量)提取 4.使用暴力匹配器進行暴力匹配 5.對匹配結果進行篩選(依據DMatch結構體中的float型別變數distance進行篩選) 6.繪製匹配結果 先上ppt

OpenCV學習筆記(三十三)——用haar特徵訓練自己的分類器(再做手勢檢測)

資料還是得看啊,又讀了經典文獻《Robust Real-Time Face Detection》,不願意讀原文的朋友可以看看http://blog.csdn.net/hqw7286/article/details/5556767,作者把文中的要點基本也都總結出來了。Ope

OpenCV學習筆記[5]FLANN特徵匹配

OpenCV學習筆記:FLANN特徵匹配         本次給出FLANN特徵匹配的Java實現。 [簡介]         特徵匹配記錄下目標影象與待匹配影象的特徵點(KeyPoint),並根據特徵點集合構造特徵量(descriptor),對這個特徵量進行比較、篩選,

OpenCV學習筆記10):人臉檢測

1. 前言 OpenCV實現人臉檢測主要是採用了adaboost分類演算法,這種演算法是屬於機器學習範疇,需要使用海量圖片進行訓練,得到一個分類檔案,然後根據該檔案中的引數進行人臉檢測。由於訓練過程比較複雜,我們在此不再累述,直接使用官方釋出的XML檔案即可。

openCV學習筆記(十二) —— 人臉識別演算法(1/3)—— 特徵臉 EigenFaces

一、原理 opencv支援3種人臉識別的演算法,分別是: 1.    Eigen Faces    PCA(特徵臉方法) 2.    Fisher Faces    LDA(線性判別分析) 3.    Local Binary Pattern Histograms(LB

(四)OpenCV中的特徵檢測之SIFT(尺度變換特徵)

註釋:本文翻譯自OpenCV3.0.0 document->OpenCV-Python Tutorials,包括對原文件種錯誤程式碼的糾正1.目標學習SIFT演算法的概念學習如何找到SIFT關鍵點和描述符2.理論在最後幾章,我們看到了一些角落探測器,如Harris Co