最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解opencv Python特征檢測(cè)及K-最近鄰匹配

 更新時(shí)間:2019年01月21日 08:19:25   作者:天煞孤星0嚴(yán)  
這篇文章主要介紹了詳解opencv Python特征檢測(cè)及K-最近鄰匹配,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

鑒于即將啟程旅行,先上傳篇簡(jiǎn)單的圖像檢索介紹,與各位一起學(xué)習(xí)opencv的同學(xué)共勉

一.特征檢測(cè)

圖片的特征主要分為角點(diǎn),斑點(diǎn),邊,脊向等,都是常用特征檢測(cè)算法所檢測(cè)到的圖像特征·

1.Harris角點(diǎn)檢測(cè)

先將圖片轉(zhuǎn)換為灰度模式,再使用以下函數(shù)檢測(cè)圖片的角點(diǎn)特征:

dst=cv2.cornerHarris(src, blockSize, ksize, k[, dst[, borderType]])

重點(diǎn)關(guān)注第三個(gè)參數(shù),這里使用了Sobel算子,簡(jiǎn)單來說,其取為3-31間的奇數(shù),定義了角點(diǎn)檢測(cè)的敏感性,不同圖片需要進(jìn)行調(diào)試。

k 是 Harris 角點(diǎn)檢測(cè)方程中的自由參數(shù),取值參數(shù)為[0,04,0.06].

2.DoG角點(diǎn)檢測(cè)及SIFT特征變換

Harris角點(diǎn)檢測(cè)在面對(duì)圖像尺度性發(fā)生改變時(shí)極其容易丟失圖像細(xì)節(jié),造成檢測(cè)失誤。因此在檢測(cè)圖像特征時(shí),常常我們需要一些擁有尺度不變性的特征檢測(cè)算法。

DoG角點(diǎn)檢測(cè)即將兩幅圖像在不同參數(shù)下的高斯濾波結(jié)果相減,得到DoG圖。步驟:用兩個(gè)不同的5x5高斯核對(duì)圖像進(jìn)行卷積,然后再相減的操作。重復(fù)三次得到三個(gè)差分圖A,B,C。計(jì)算出的A,B,C三個(gè)DOG圖中求圖B中是極值的點(diǎn)。圖B的點(diǎn)在當(dāng)前由A,B,C共27個(gè)點(diǎn)組成的block中是否為極大值或者極小值。若滿足此條件則認(rèn)為是角點(diǎn)。

SIFT對(duì)象會(huì)使用DoG檢測(cè)關(guān)鍵點(diǎn),并對(duì)每個(gè)關(guān)鍵點(diǎn)周圍的區(qū)域計(jì)算特征向量。事實(shí)上他僅做檢測(cè)和計(jì)算,其返回值是關(guān)鍵點(diǎn)信息(關(guān)鍵點(diǎn))和描述符。

#下列代碼即先創(chuàng)建一個(gè)SIFT對(duì)象,然后計(jì)算灰度圖像
sift = cv2.xfeatures2d.SIFT_create()
keypoints, descriptor = sift.detectAndCompute(gray, None)

#sift對(duì)象會(huì)使用DoG檢測(cè)關(guān)鍵點(diǎn),對(duì)關(guān)鍵點(diǎn)周圍的區(qū)域計(jì)算向量特征,檢測(cè)并計(jì)算

需要注意的是,返回的是關(guān)鍵點(diǎn)和描述符

關(guān)鍵點(diǎn)是點(diǎn)的列表

描述符是檢測(cè)到的特征的局部區(qū)域圖像列表

介紹一下關(guān)鍵點(diǎn)的屬性:pt: 點(diǎn)的x y坐標(biāo) size: 表示特征的直徑 angle: 特征方向 response: 關(guān)鍵點(diǎn)的強(qiáng)度 octave: 特征所在金字塔層級(jí),算法進(jìn)行迭代的時(shí)候, 作為參數(shù)的圖像尺寸和相鄰像素會(huì)發(fā)生變化octave屬性表示檢測(cè)到關(guān)鍵點(diǎn)所在的層級(jí) ID: 檢測(cè)到關(guān)鍵點(diǎn)的ID

SIFT特征不只具有尺度不變性,即使改變旋轉(zhuǎn)角度,圖像亮度或拍攝視角,仍然能夠得到好的檢測(cè)效果。

3.SURF提取和檢測(cè)特征

SURF是SIFT的加速版算法,采用快速Hessian算法檢測(cè)關(guān)鍵點(diǎn)

借用下度娘的說法:SURF算法原理:

1.構(gòu)建Hessian矩陣構(gòu)造高斯金字塔尺度空間

2.利用非極大值抑制初步確定特征點(diǎn)

3精確定位極值點(diǎn)

4選取特征點(diǎn)的主方向

5構(gòu)造surf特征點(diǎn)描述算子

具體應(yīng)用看代碼

import cv2
import numpy as np
img = cv2.imread('/home/yc/Pictures/jianbin.jpg')
#參數(shù)為hessian矩陣的閾值
surf = cv2.xfeatures2d.SURF_create(4000)
#設(shè)置是否要檢測(cè)方向
surf.setUpright(True)
#輸出設(shè)置值
print(surf.getUpright())
#找到關(guān)鍵點(diǎn)和描述符
key_query,desc_query = surf.detectAndCompute(img,None)
img=cv2.drawKeypoints(img,key_query,img)
#輸出描述符的個(gè)數(shù)
print(surf.descriptorSize())
cv2.namedWindow("jianbin",cv2.WINDOW_NORMAL)
cv2.imshow('jianbin',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這是檢測(cè)效果,圖中已標(biāo)志出特征點(diǎn),不要問我為什么選這種鬼畜樣圖,可能是因?yàn)榍閼?滑稽)

樣圖

需要注意的是,需要安裝之前版本的opencv-contrib庫才可以使用,surf及sift均受專利保護(hù)

4.orb特征提取

ORB算法使用FAST算法尋找關(guān)鍵點(diǎn),然后使用Harris角點(diǎn)檢測(cè)找到這些點(diǎn)當(dāng)中的最好的N個(gè)點(diǎn),采用BRIEF描述子的特性。ORB算法處于起步階段,速度優(yōu)于前兩種算法,也吸收了其優(yōu)點(diǎn),同時(shí)他是開源的。

# 創(chuàng)建ORB特征檢測(cè)器和描述符
orb = cv2.ORB_create()
kp = orb.detect(img,None)
 # 對(duì)圖像檢測(cè)特征和描述符
kp, des = orb.compute(img, kp)
#注意kp是一個(gè)包含若干點(diǎn)的列表,des對(duì)應(yīng)每個(gè)點(diǎn)的描述符 是一個(gè)列表, 每一項(xiàng)都是檢測(cè)>到的特征的局部圖像

二、特征匹配

1.BF暴力匹配

暴力匹配的算法難以進(jìn)行優(yōu)化,是一種描述符匹配方法,將每個(gè)對(duì)應(yīng)的描述符的特征進(jìn)行比較,每次比較給出一個(gè)距離值,最好的結(jié)果賊被認(rèn)為是一個(gè)匹配。

# 暴力匹配BFMatcher,遍歷描述符,確定描述符是否匹配,然后計(jì)算匹配距離并排序
# BFMatcher函數(shù)參數(shù):
# normType:NORM_L1, NORM_L2, NORM_HAMMING, NORM_HAMMING2。
# NORM_L1和NORM_L2是SIFT和SURF描述符的優(yōu)先選擇,NORM_HAMMING和NORM_HAMMING2是用于ORB算法
bf = cv2.BFMatcher(normType=cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1,des2)
matches = sorted(matches, key = lambda x:x.distance)
# matches是DMatch對(duì)象,具有以下屬性:
# DMatch.distance - 描述符之間的距離。 越低越好。
# DMatch.trainIdx - 訓(xùn)練描述符中描述符的索引
# DMatch.queryIdx - 查詢描述符中描述符的索引
# DMatch.imgIdx - 訓(xùn)練圖像的索引。

2.K-最近鄰匹配

KNN算法可能是最簡(jiǎn)單的機(jī)器學(xué)習(xí)算法,即給定一個(gè)已訓(xùn)練的數(shù)據(jù)集,對(duì)新的輸入實(shí)例,在訓(xùn)練數(shù)據(jù)集中找到與該實(shí)例最鄰近的K個(gè)實(shí)例,這K個(gè)實(shí)例的多數(shù)屬于某個(gè)類,則判定該輸入實(shí)例同屬此類。

概念比較冗長(zhǎng),大致可以理解為如果一個(gè)樣本在特征空間中的k個(gè)最相似(即特征空間中最鄰近)的樣本中的大多數(shù)屬于某一個(gè)類別,則該樣本也屬于這個(gè)類別,我個(gè)人簡(jiǎn)單的理解為由那離自己最近的K個(gè)點(diǎn)來投票決定待分類數(shù)據(jù)歸為哪一類。

這里我們直接調(diào)用opencv庫中的KNN函數(shù),使用較簡(jiǎn)單。該KNN匹配利用BF匹配后的數(shù)據(jù)進(jìn)行匹配。

完整代碼:

# coding:utf-8
 
 import cv2

# 按照灰度圖像讀入兩張圖片
img1 = cv2.imread("/home/yc/Pictures/cat.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("/home/yc/Pictures/cat2.jpg", cv2.IMREAD_GRAYSCALE)
 
# 獲取特征提取器對(duì)象
orb = cv2.ORB_create()
# 檢測(cè)關(guān)鍵點(diǎn)和特征描述
keypoint1, desc1 = orb.detectAndCompute(img1, None)
keypoint2, desc2 = orb.detectAndCompute(img2, None)
"""
keypoint 是關(guān)鍵點(diǎn)的列表
desc 檢測(cè)到的特征的局部圖的列表
"""
# 獲得knn檢測(cè)器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.knnMatch(desc1, desc2, k=1)

"""
knn 匹配可以返回k個(gè)最佳的匹配項(xiàng)
bf返回所有的匹配項(xiàng)
"""
# 畫出匹配結(jié)果
img3 = cv2.drawMatchesKnn(img1, keypoint1, img2, keypoint2, matches, img2, flags=2)
cv2.imshow("cat", img3)
cv2.waitKey()
cv2.destroyAllWindows()

也許這里得到的結(jié)果與match函數(shù)所得到的結(jié)果差距不大,但二者主要區(qū)別是KnnMatch所返回的是K個(gè)匹配值,可以容許我們繼續(xù)處理,而match返回最佳匹配。

以下為樣圖

cat

實(shí)現(xiàn)簡(jiǎn)單的圖像檢索功能時(shí),此類特征匹配算法對(duì)硬件的要求較低,效率較高,但是準(zhǔn)確度有待考量

與一起學(xué)習(xí)opencv的同學(xué)共勉,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python標(biāo)準(zhǔn)庫ElementTree處理xml

    python標(biāo)準(zhǔn)庫ElementTree處理xml

    這篇文章主要為大家介紹了python標(biāo)準(zhǔn)庫ElementTree處理xml的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python中的round()函數(shù)用法詳解

    python中的round()函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于python中round()函數(shù)用法的相關(guān)資料,round()函數(shù)是Python內(nèi)置函數(shù)之一,用于對(duì)數(shù)字進(jìn)行四舍五入操作,需要的朋友可以參考下
    2023-08-08
  • Python編程獲取終端命令行參數(shù)示例

    Python編程獲取終端命令行參數(shù)示例

    這篇文章主要為大家介紹了Python編程獲取終端命令行參數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python加載文件內(nèi)容的兩種實(shí)現(xiàn)方式

    Python加載文件內(nèi)容的兩種實(shí)現(xiàn)方式

    這篇文章主要介紹了Python加載文件內(nèi)容的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • PyTorch的nn.Module類的定義和使用介紹

    PyTorch的nn.Module類的定義和使用介紹

    在PyTorch中,nn.Module類是構(gòu)建神經(jīng)網(wǎng)絡(luò)模型的基礎(chǔ)類,所有自定義的層、模塊或整個(gè)神經(jīng)網(wǎng)絡(luò)架構(gòu)都需要繼承自這個(gè)類,本文介紹PyTorch的nn.Module類的定義和使用介紹,感興趣的朋友一起看看吧
    2024-01-01
  • Python使用socket模塊實(shí)現(xiàn)簡(jiǎn)單tcp通信

    Python使用socket模塊實(shí)現(xiàn)簡(jiǎn)單tcp通信

    這篇文章主要介紹了Python使用socket模塊實(shí)現(xiàn)簡(jiǎn)單tcp通信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 基于文件路徑中/?\?//?\\的用法以及絕對(duì)相對(duì)路徑的問題

    基于文件路徑中/?\?//?\\的用法以及絕對(duì)相對(duì)路徑的問題

    這篇文章主要介紹了基于文件路徑中/?\?//?\\的用法以及絕對(duì)相對(duì)路徑的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法

    python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • python溫度轉(zhuǎn)換華氏溫度實(shí)現(xiàn)代碼

    python溫度轉(zhuǎn)換華氏溫度實(shí)現(xiàn)代碼

    這篇文章主要介紹了python溫度轉(zhuǎn)換華氏溫度實(shí)現(xiàn)代碼內(nèi)容,有需要的朋友們可以測(cè)試下。
    2020-12-12
  • python模塊和包的應(yīng)用BASE_PATH使用解析

    python模塊和包的應(yīng)用BASE_PATH使用解析

    這篇文章主要介紹了python模塊和包的應(yīng)用BASE_PATH使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12

最新評(píng)論

珲春市| 绥中县| 肃宁县| 东台市| 临西县| 当涂县| 岢岚县| 榆树市| 弥渡县| 靖西县| 钟祥市| 庐江县| 嘉荫县| 盐源县| 扬中市| 阳城县| 大渡口区| 苍溪县| 闸北区| 伊宁市| 景德镇市| 沂水县| 堆龙德庆县| 岑溪市| 营口市| 庆阳市| 庆元县| 绥宁县| 清涧县| 宜黄县| 资阳市| 密云县| 长海县| 长春市| 塔城市| 龙山县| 嵩明县| 绿春县| 靖边县| 德安县| 万年县|