亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python語言實(shí)現(xiàn)SIFT算法

 更新時(shí)間:2021年11月15日 08:57:59   作者:米開朗琪羅兒  
SIFT,即尺度不變特征變換,是用于圖像處理領(lǐng)域的一種描述,本文重點(diǎn)給大家介紹Python語言實(shí)現(xiàn)SIFT算法,感興趣的朋友一起看看吧

本文側(cè)重于如何使用Python語言實(shí)現(xiàn)SIFT算法

所有程序已打包基于OpenCV-Python的SIFT算法的實(shí)現(xiàn)

一、什么是SIFT算法

  SIFT,即尺度不變特征變換(Scale-invariant feature transform,SIFT),是用于圖像處理領(lǐng)域的一種描述。這種描述具有尺度不變性,可在圖像中檢測(cè)出關(guān)鍵點(diǎn),是一種局部特征描述子。

二、準(zhǔn)備工作

2.1 實(shí)驗(yàn)設(shè)備

  本文在Windows10系統(tǒng)上,使用pycharm軟件完成所有實(shí)驗(yàn)。

2.2 OpenCV安裝

  我們可以使用OpenCV庫中的cv2.xfeatures2d.SIFT_create()函數(shù)實(shí)現(xiàn)SIFT,但由于專利保護(hù),很多版本的OpenCV庫已無法提供該函數(shù),目前僅3.4.2.16版本的OpenCV庫可使用此函數(shù)。

安裝教程
  (1)查看當(dāng)前版本opencv:進(jìn)入cmd(組合鍵win+R,輸入cmd),輸入conda list,查看當(dāng)前pycharm所有庫并找到opencv-python,若找不到庫,說明沒有安裝。
  (2)卸載原版本(在cmd中輸入:pip uninstall opencv
  (3)安裝新版本(在cmd中輸入:pip install opencv-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"
  (4)安裝附屬庫(在cmd中輸入:pip install opencv-contrib-python==3.4.2.16 -i "https://pypi.doubanio.com/simple/"

三、實(shí)驗(yàn)工作

3.1 圖像選擇

  這里選擇經(jīng)典的lena圖像作為實(shí)驗(yàn)對(duì)象,為了選擇一個(gè)待匹配圖像,本文使用如下代碼對(duì)lena圖像進(jìn)行逆時(shí)針45°旋轉(zhuǎn)。

from PIL import Image

img = Image.open('lena.png')
img2 = img.rotate(45)       # 逆時(shí)針旋轉(zhuǎn)45°
img2.save("lena_rot45.png")
img2.show()

參考圖像與待匹配圖像(即旋轉(zhuǎn)圖像)如下圖所示:

在這里插入圖片描述

3.2 程序?qū)崿F(xiàn)

"""
圖像匹配——SIFT點(diǎn)特征匹配實(shí)現(xiàn)步驟:
    (1)讀取圖像;
    (2)定義sift算子;
    (3)通過sift算子對(duì)需要匹配的圖像進(jìn)行特征點(diǎn)獲?。?
        a.可獲取各匹配圖像經(jīng)過sift算子的特征點(diǎn)數(shù)目
    (4)可視化特征點(diǎn)(在原圖中標(biāo)記為圓圈);
        a.為方便觀察,可將匹配圖像橫向拼接
    (5)圖像匹配(特征點(diǎn)匹配);
        a.通過調(diào)整ratio獲取需要進(jìn)行圖像匹配的特征點(diǎn)數(shù)量(ratio值越大,匹配的線條越密集,但錯(cuò)誤匹配點(diǎn)也會(huì)增多)
        b.通過索引ratio選擇固定的特征點(diǎn)進(jìn)行圖像匹配
    (6)將待匹配圖像通過旋轉(zhuǎn)、變換等方式將其與目標(biāo)圖像對(duì)齊
"""

import cv2              # opencv版本需為3.4.2.16
import numpy as np      # 矩陣運(yùn)算庫
import time             # 時(shí)間庫

original_lena = cv2.imread('lena.png')          # 讀取lena原圖
lena_rot45 = cv2.imread('lena_rot45.png')       # 讀取lena旋轉(zhuǎn)45°圖

sift = cv2.xfeatures2d.SIFT_create()

# 獲取各個(gè)圖像的特征點(diǎn)及sift特征向量
# 返回值kp包含sift特征的方向、位置、大小等信息;des的shape為(sift_num, 128), sift_num表示圖像檢測(cè)到的sift特征數(shù)量
(kp1, des1) = sift.detectAndCompute(original_lena, None)
(kp2, des2) = sift.detectAndCompute(lena_rot45, None)

# 特征點(diǎn)數(shù)目顯示
print("=========================================")
print("=========================================")
print('lena 原圖  特征點(diǎn)數(shù)目:', des1.shape[0])
print('lena 旋轉(zhuǎn)圖 特征點(diǎn)數(shù)目:', des2.shape[0])
print("=========================================")
print("=========================================")

# 舉例說明kp中的參數(shù)信息
for i in range(2):
    print("關(guān)鍵點(diǎn)", i)
    print("數(shù)據(jù)類型:", type(kp1[i]))
    print("關(guān)鍵點(diǎn)坐標(biāo):", kp1[i].pt)
    print("鄰域直徑:", kp1[i].size)
    print("方向:", kp1[i].angle)
    print("所在的圖像金字塔的組:", kp1[i].octave)

print("=========================================")
print("=========================================")
"""
首先對(duì)原圖和旋轉(zhuǎn)圖進(jìn)行特征匹配,即圖original_lena和圖lena_rot45
"""
# 繪制特征點(diǎn),并顯示為紅色圓圈
sift_original_lena = cv2.drawKeypoints(original_lena, kp1, original_lena, color=(255, 0, 255))
sift_lena_rot45 = cv2.drawKeypoints(lena_rot45, kp2, lena_rot45, color=(255, 0, 255))

sift_cat1 = np.hstack((sift_original_lena, sift_lena_rot45))        # 對(duì)提取特征點(diǎn)后的圖像進(jìn)行橫向拼接
cv2.imwrite("sift_cat1.png", sift_cat1)
print('原圖與旋轉(zhuǎn)圖 特征點(diǎn)繪制圖像已保存')
cv2.imshow("sift_point1", sift_cat1)
cv2.waitKey()

# 特征點(diǎn)匹配
# K近鄰算法求取在空間中距離最近的K個(gè)數(shù)據(jù)點(diǎn),并將這些數(shù)據(jù)點(diǎn)歸為一類
start = time.time()     # 計(jì)算匹配點(diǎn)匹配時(shí)間
bf = cv2.BFMatcher()
matches1 = bf.knnMatch(des1, des2, k=2)
print('用于 原圖和旋轉(zhuǎn)圖 圖像匹配的所有特征點(diǎn)數(shù)目:', len(matches1))

# 調(diào)整ratio
# ratio=0.4:對(duì)于準(zhǔn)確度要求高的匹配;
# ratio=0.6:對(duì)于匹配點(diǎn)數(shù)目要求比較多的匹配;
# ratio=0.5:一般情況下。
ratio1 = 0.5
good1 = []

for m1, n1 in matches1:
    # 如果最接近和次接近的比值大于一個(gè)既定的值,那么我們保留這個(gè)最接近的值,認(rèn)為它和其匹配的點(diǎn)為good_match
    if m1.distance < ratio1 * n1.distance:
        good1.append([m1])

end = time.time()
print("匹配點(diǎn)匹配運(yùn)行時(shí)間:%.4f秒" % (end-start))

# 通過對(duì)good值進(jìn)行索引,可以指定固定數(shù)目的特征點(diǎn)進(jìn)行匹配,如good[:20]表示對(duì)前20個(gè)特征點(diǎn)進(jìn)行匹配
match_result1 = cv2.drawMatchesKnn(original_lena, kp1, lena_rot45, kp2, good1, None, flags=2)
cv2.imwrite("match_result1.png", match_result1)

print('原圖與旋轉(zhuǎn)圖 特征點(diǎn)匹配圖像已保存')
print("=========================================")
print("=========================================")
print("原圖與旋轉(zhuǎn)圖匹配對(duì)的數(shù)目:", len(good1))

for i in range(2):
    print("匹配", i)
    print("數(shù)據(jù)類型:", type(good1[i][0]))
    print("描述符之間的距離:", good1[i][0].distance)
    print("查詢圖像中描述符的索引:", good1[i][0].queryIdx)
    print("目標(biāo)圖像中描述符的索引:", good1[i][0].trainIdx)

print("=========================================")
print("=========================================")
cv2.imshow("original_lena and lena_rot45 feature matching result", match_result1)
cv2.waitKey()

# 將待匹配圖像通過旋轉(zhuǎn)、變換等方式將其與目標(biāo)圖像對(duì)齊,這里使用單應(yīng)性矩陣。
# 單應(yīng)性矩陣有八個(gè)參數(shù),如果要解這八個(gè)參數(shù)的話,需要八個(gè)方程,由于每一個(gè)對(duì)應(yīng)的像素點(diǎn)可以產(chǎn)生2個(gè)方程(x一個(gè),y一個(gè)),那么總共只需要四個(gè)像素點(diǎn)就能解出這個(gè)單應(yīng)性矩陣。
if len(good1) > 4:
    ptsA = np.float32([kp1[m[0].queryIdx].pt for m in good1]).reshape(-1, 1, 2)
    ptsB = np.float32([kp2[m[0].trainIdx].pt for m in good1]).reshape(-1, 1, 2)
    ransacReprojThreshold = 4
    # RANSAC算法選擇其中最優(yōu)的四個(gè)點(diǎn)
    H, status =cv2.findHomography(ptsA, ptsB, cv2.RANSAC, ransacReprojThreshold)
    imgout = cv2.warpPerspective(lena_rot45, H, (original_lena.shape[1], original_lena.shape[0]),
                                 flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)

    cv2.imwrite("imgout.png", imgout)
    cv2.imshow("lena_rot45's result after transformation", imgout)
    cv2.waitKey()

3.3 程序結(jié)果

在這里插入圖片描述

到此這篇關(guān)于Python語言實(shí)現(xiàn)SIFT算法的文章就介紹到這了,更多相關(guān)python SIFT算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python自動(dòng)化測(cè)試selenium執(zhí)行js腳本實(shí)現(xiàn)示例

    python自動(dòng)化測(cè)試selenium執(zhí)行js腳本實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了python自動(dòng)化測(cè)試selenium執(zhí)行js腳本的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 什么是python的函數(shù)體

    什么是python的函數(shù)體

    在本篇文章里小編給大家分享的是一篇關(guān)于python函數(shù)體的基礎(chǔ)知識(shí)點(diǎn),需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • Python自動(dòng)化處理Excel數(shù)據(jù)的操作過程

    Python自動(dòng)化處理Excel數(shù)據(jù)的操作過程

    在實(shí)際數(shù)據(jù)處理和分析過程中,經(jīng)常會(huì)遇到需要從大量數(shù)據(jù)中提取出特定日期范圍內(nèi)的信息的需求,本文將介紹如何使用Python的pandas庫來處理Excel文件,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • Python實(shí)戰(zhàn)之大魚吃小魚游戲的實(shí)現(xiàn)

    Python實(shí)戰(zhàn)之大魚吃小魚游戲的實(shí)現(xiàn)

    這篇文章主要介紹了如何利用Python制作一個(gè)經(jīng)典游戲之大魚吃小魚,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下
    2022-04-04
  • 完美解決Pycharm中matplotlib畫圖中文亂碼問題

    完美解決Pycharm中matplotlib畫圖中文亂碼問題

    這篇文章主要介紹了完美解決Pycharm中matplotlib畫圖中文亂碼問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 使用Python操作文件系統(tǒng)的方法

    使用Python操作文件系統(tǒng)的方法

    Python提供了許多內(nèi)置庫來處理文件系統(tǒng),如os、shutil和pathlib等,這些庫可以幫助你創(chuàng)建、刪除、讀取、寫入文件和目錄,這篇文章主要介紹了使用Python操作文件系統(tǒng),需要的朋友可以參考下
    2023-07-07
  • Mac下python包管理工具pip的安裝

    Mac下python包管理工具pip的安裝

    這篇文章介紹了Mac下python包管理工具pip的安裝方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果示例

    Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果示例

    這篇文章主要介紹了Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS圖像調(diào)整中顏色梯度的原理與相關(guān)操作技巧,需要的朋友可以參考下
    2018-01-01
  • 基python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲

    基python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲

    python是支持多線程的, 主要是通過thread和threading這兩個(gè)模塊來實(shí)現(xiàn)的,本文主要給大家分享python實(shí)現(xiàn)多線程網(wǎng)頁爬蟲,需要的朋友可以參考下
    2015-09-09
  • Python多進(jìn)程分塊讀取超大文件的方法

    Python多進(jìn)程分塊讀取超大文件的方法

    這篇文章主要介紹了Python多進(jìn)程分塊讀取超大文件的方法,涉及Python多進(jìn)程操作與文件分塊讀取的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04

最新評(píng)論