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