OpenCV-Python中的圖像處理-圖像特征

OpenCV-Python中的圖像處理-圖像特征

  • 圖像特征
    • Harris角點檢測
    • 亞像素級精度的角點檢測
    • Shi-Tomasi角點檢測
    • SIFT(Scale-Invariant Feature Transfrom)
    • SURF(Speeded-Up Robust Features)
    • FAST算法
    • BRIEF(Binary Robust Independent Elementary Features)算法
    • ORB (Oriented FAST and Rotated BRIEF)算法
  • 特征匹配
    • Brute-Force 蠻力匹配
      • 對 ORB 描述符進行蠻力匹配
      • 對 SIFT 描述符進行蠻力匹配和比值測試
    • FLANN 匹配

圖像特征

  • 特征理解
  • 特征檢測
  • 特征描述

Harris角點檢測

  • cv2.cornerHarris(img, blockSize, ksize, k, borderType=…)
    • img:輸入圖像,數據類型為float32
    • blockSize:角點檢測中要考慮的領域大小
    • ksize:Sobe求導中使用的窗口大小
    • k:Harris角點檢測方程中的自由參數,取值參數為 [0.04,0.06]
    • borderType:邊界類型
import numpy as np
import cv2
from matplotlib import pyplot as plt# img = cv2.imread('./resource/opencv/image/chessboard.png', cv2.IMREAD_COLOR)
img = cv2.imread('./resource/opencv/image/pattern.png', cv2.IMREAD_COLOR)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray = np.float32(gray)# 輸入圖像必須是float32,最后一個參數在0.04到0.05之間
dst = cv2.cornerHarris(gray, 2, 3, 0.05)
dst = cv2.dilate(dst, None)img[dst>0.01*dst.max()] = [0, 0, 255]cv2.imshow('dst', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

亞像素級精度的角點檢測

  • cv2.cornerSubPix(img, corners, winSize, zeroZone, criteria)
    最大精度的角點檢測,首先要找到 Harris角點,然后將角點的重心傳給這個函數進行修正。
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/subpixel.png', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)
dst = cv2.dilate(dst, None)
ret, dst = cv2.threshold(dst, 0.01*dst.max(), 255, 0)
dst = np.uint8(dst)ret, labels, stats, centroids = cv2.connectedComponentsWithStats(dst)criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.001)corners = cv2.cornerSubPix(gray, np.float32(centroids), (5,5), (-1, -1), criteria)res = np.hstack((centroids, corners))res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]]=[0,255,0]cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Harris 角點用紅色像素標出,綠色像素是修正后的角點。
在這里插入圖片描述

Shi-Tomasi角點檢測

  • cv2.goodFeatureToTrack()
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/shitomasi_block.jpg', cv2.IMREAD_COLOR)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)corners = cv2.goodFeaturesToTrack(gray, 25, 0.01, 10)corners = np.int0(corners)for i in corners:x,y = i.ravel()cv2.circle(img, (x,y), 3, 255, -1)plt.imshow(img)
plt.show()

在這里插入圖片描述

SIFT(Scale-Invariant Feature Transfrom)

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

  • cv2.SIFT_create()

    • kp = sift.detect(img, None):查找特征點
    • kp, des = sift.compute(img, kp):計算特征點
    • kp, des = sift.detectAndCompute(img, None) :直接找到特征點并計算描述符
  • cv2.drawKeypoints(img, kp, out_img, flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS):畫特征點

    • img : 輸入圖像
    • kp:圖像特征點
    • out_img:輸出圖像
    • 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
import numpy as np
import cv2# 讀取圖片
# img = cv2.imread('./resource/opencv/image/home.jpg')
img = cv2.imread('./resource/opencv/image/AverageMaleFace.jpg')
key_points = img.copy()# 實例化SIFT算法
sift = cv2.SIFT_create()# 得到特征點
kp = sift.detect(img, None)
print(np.array(kp).shape)# 繪制特征點
cv2.drawKeypoints(img, kp, key_points, flags=cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)# 圖片展示
cv2.imshow("key points", key_points)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存圖片
# cv2.imwrite("key_points.jpg", key_points)# 計算特征
kp, des = sift.compute(img, kp)# 調試輸出
print(des.shape)
print(des[0])cv2.imshow('kp', key_points)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

SURF(Speeded-Up Robust Features)

  • 文章前面介紹了使用 SIFT 算法進行關鍵點檢測和描述。但是這種算法的執行速度比較慢,人們需要速度更快的算法。在 2006 年Bay,H.,Tuytelaars,T. 和 Van Gool,L 共同提出了 SURF(加速穩健特征)算法。跟它的名字一樣,這是個算法是加速版的 SIFT。
  • 與 SIFT 相同 OpenCV 也提供了 SURF 的相關函數。首先我們要初始化一個 SURF 對象,同時設置好可選參數: 64/128 維描述符, Upright/Normal 模式等。所有的細節都已經在文檔中解釋的很明白了。就像我們在SIFT 中一樣,我們可以使用函數 SURF.detect(), SURF.compute() 等來進行關鍵點攙著和描述。

img = cv2.imread(‘fly.png’, 0)
surf = cv2.SURF(400)
kp, des = surf.detectAndCompute(img, None)
len(kp) # 699
print(surf.hessianThreshold)
surf.hessianThreshold = 50000
kp, des = surf.detectAndCompute(img,None)
print(len(kp)) # 47
不檢測關鍵點的方向
print(surf.upright) #False
surf.upright = True

FAST算法

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/fly.jpg', cv2.IMREAD_GRAYSCALE)# fast = cv2.FastFeatureDetector_create(threshold=100, nonmaxSuppression=False, type=cv2.FAST_FEATURE_DETECTOR_TYPE_5_8)
fast = cv2.FastFeatureDetector_create(threshold=400)
kp = fast.detect(img, None)
img2 = cv2.drawKeypoints(img, kp, img.copy(), color=(0, 0, 255), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow('fast', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

BRIEF(Binary Robust Independent Elementary Features)算法

  • BRIEF(Binary Robust Independent Elementary Features)
import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/fly.jpg', cv2.IMREAD_GRAYSCALE)# Initiate STAR detector
star = cv2.FeatureDetector_create("STAR")
# Initiate BRIEF extractor
brief = cv2.DescriptorExtractor_create("BRIEF")
# find the keypoints with STAR
kp = star.detect(img,None)
# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)
print(brief.getInt('bytes'))
print(des.shape)

ORB (Oriented FAST and Rotated BRIEF)算法

import numpy as np
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('./resource/opencv/image/fly.jpg', cv2.IMREAD_GRAYSCALE)# ORB_create(nfeatures=..., scaleFactor=..., nlevels=..., edgeThreshold=..., firstLevel=..., WTA_K=..., scoreType=..., patchSize=..., fastThreshold=...)
orb = cv2.ORB_create()kp = orb.detect(img, None)kp, des = orb.compute(img, kp)img2 = cv2.drawKeypoints(img, kp, img.copy(), color=(255, 0, 0), flags=0)
plt.imshow(img2)
plt.show()

在這里插入圖片描述

特征匹配

OpenCV 中的特征匹配

  • 蠻力( Brute-Force)匹配
  • FLANN 匹配

Brute-Force 蠻力匹配

對 ORB 描述符進行蠻力匹配

import numpy as np
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('./resource/opencv/image/box.png', 0)
img2 = cv2.imread('./resource/opencv/image/box_in_scene.png', 0)orb = cv2.ORB_create()kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)bf = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck=True)matches = bf.match(des1, des2)# matches = bf:match(des1; des2) 返回值是一個 DMatch 對象列表。這個
# DMatch 對象具有下列屬性:
# ? DMatch.distance - 描述符之間的距離。越小越好。
# ? DMatch.trainIdx - 目標圖像中描述符的索引。
# ? DMatch.queryIdx - 查詢圖像中描述符的索引。
# ? DMatch.imgIdx - 目標圖像的索引。# 距離排序
matches = sorted(matches, key = lambda x:x.distance)# 畫出前30匹配
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:30], None, flags=2)cv2.imshow('img', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

在這里插入圖片描述

對 SIFT 描述符進行蠻力匹配和比值測試

現在我們使用 BFMatcher.knnMatch() 來獲得 k 對最佳匹配。在本例中我們設置 k = 2,這樣我們就可以使用 D.Lowe 文章中的比值測試了。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('./resource/opencv/image/box.png', 0)
img2 = cv2.imread('./resource/opencv/image/box_in_scene.png', 0)sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)bf = cv2.BFMatcher_create()
matches = bf.knnMatch(des1, des2, k=2)good = []
for m,n in matches:if m.distance < 0.75*n.distance:good.append([m])# drawMatchesKnn(img1, keypoints1, img2, keypoints2, matches1to2, outImg, matchColor=..., singlePointColor=..., matchesMask=..., flags: int = ...)
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good[:100], None, flags=2)
plt.imshow(img3)
plt.show()

在這里插入圖片描述

FLANN 匹配

FLANN 是快速最近鄰搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的簡稱。它是一個對大數據集和高維特征進行最近鄰搜索的算法的集合,而且這些算法都已經被優化過了。在面對大數據集時它的效果要好于 BFMatcher。我們來對第二個例子使用 FLANN 匹配看看它的效果。

import numpy as np
import cv2
from matplotlib import pyplot as pltimg1 = cv2.imread('./resource/opencv/image/box.png', 0)
img2 = cv2.imread('./resource/opencv/image/box_in_scene.png', 0)sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)flann = cv2.FlannBasedMatcher_create()
matches = flann.knnMatch(des1, des2, k=2)matchesMask = [[0,0] for i in range(len(matches))]for i, (m, n) in enumerate(matches):if m.distance < 0.7*n.distance:matchesMask[i] = [1,0]draw_params = dict(matchColor = (0, 255, 0),singlePointColor = (255, 0, 0),matchesMask = matchesMask,flags = 0)img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **draw_params)
plt.imshow(img3)
plt.show()

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41763.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JavaScript判空設默認值的幾種寫法

前端面試題庫 &#xff08;面試必備&#xff09; 推薦&#xff1a;★★★★★ 地址&#xff1a;前端面試題庫 實踐中需要給某個變量賦值時&#xff0c;若數據來源不可控&#xff0c;通常會給它設置一個默認值&#xff08;就像空對象模式一樣&#xff09;。JavaScri…

python編程中有哪些方便的調試方法

大家好&#xff0c;給大家分享一下一個有趣的事情&#xff0c;很多人還不知道這一點。下面詳細解釋一下。現在讓我們來看看&#xff01; 對于每個程序開發者來說&#xff0c;調試幾乎是必備技能。常用Pycharm編輯器里的方法有Print大法、log大法&#xff0c;但缺少類似Matlab的…

敏感掛載binfmt_misc容器逃逸復現和分析

前言 對于/proc下有很多掛載會導致容器逃逸&#xff0c;其中binfmt_misc就是一種可以利用的逃逸掛載 binfmt_mics 實驗 touch test_fmt_intp echo aaa > test_fmt echo #!/bin/sh > test_fmt_intp echo >> test_fmt_intp chmod x test_fmt_intp echo :test_fmt…

怎么開通Tik Tok海外娛樂公會呢?

TikTok作為全球知名的社交媒體平臺&#xff0c;吸引了數億用戶的關注和參與。許多公司和個人渴望通過開通TikTok直播公會進入這一領域&#xff0c;以展示自己的創造力和吸引更多粉絲。然而&#xff0c;成為TikTok直播公會并非易事&#xff0c;需要滿足一定的門檻和申請找cmxyci…

【日常積累】Linux之init系統學習

init系統簡介: Linux 操作系統的啟動首先從 BIOS 開始&#xff0c;接下來進入 boot loader&#xff0c;由 bootloader 載入內核&#xff0c;進行內核初始化。內核初始化的最后一步就是啟動 pid 為 1 的 init 進程&#xff0c;這個進程是系統的第一個進程&#xff0c;它負責產生…

銀河麒麟服務器v10 sp1 .Net6.0 上傳文件錯誤

上一篇&#xff1a;銀河麒麟服務器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 .NET 6之前&#xff0c;在Linux服務器上安裝 libgdiplus 即可解決&#xff0c;libgdiplus是System.Drawing.Common原生端跨平臺實現的主要提供者&#xff0c;是開源mono項目。地址…

封裝form表單

目錄 1. 源碼 2. 其他頁面引用 ps&#xff1a;請看完看明白再復用 1. 源碼 <template><div style"width: 100%; height: 100%" class"form-condition"><!-- 普通表單 --><el-card shadow"hover" class"cardheigh…

AQS的原理及應用

文章目錄 AQS引言AQS 的原理AQS 應用舉例1:Semaphore舉例2:ReentrantLockAQS 的案例分析問題背景解決方案AQS 引言 在我們的日常生活和工作中,往往需要協調各個線程之間的執行順序和資源使用,而AQS(AbstractQueuedSynchronizer)即為 Java 并發包中提供的一種解決辦法。…

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia 初環境與設備環境準備克隆模型代碼部署 ChatGLM-6B完整代碼 ChatGLM-6B 是一個開源的、支持中英雙語的對話語言模型&#xff0c;基于 General Language Model (GLM) 架構&#xff0c;具有 62 億參數。結合模型量化技術&#x…

力扣 322. 零錢兌換

題目來源&#xff1a;https://leetcode.cn/problems/coin-change/description/ C題解&#xff08;來源代碼隨想錄&#xff09;&#xff1a;題目中說每種硬幣的數量是無限的&#xff0c;可以看出是典型的完全背包問題。動規五部曲分析如下&#xff1a; 確定dp數組以及下標的含義…

深入理解設計模式-創建型之建造者模式(與工廠區別)

什么是建造者設計模式&#xff1f;和工廠設計模式有什么區別 建造者設計模式&#xff08;Builder Design Pattern&#xff09;和工廠設計模式&#xff08;Factory Design Pattern&#xff09;都是面向對象設計中的創建型模式&#xff0c;但它們解決的問題和應用場景有所不同。…

原碼、反碼、補碼,進制轉換,有符號數和無符號數轉換

計算機底層存儲數據時&#xff0c;存儲的是數據對應的二進制數字。對于整型數據&#xff0c;其二進制表示形式有三種&#xff0c;分別是&#xff1a;原碼、反碼、補碼&#xff0c;而實際存儲的是整型數據的補碼。 原碼、反碼以及補碼都是有符號的&#xff0c;其中最高位存放符…

帶你掌握Stable Diffution商業級玩法

課程介紹 學習地址 《Stable Diffusion商業級玩法》通過詳細講解AI繪畫技巧、實操演示和個性化指導&#xff0c;幫助您從零基礎成為繪畫高手&#xff0c;幫助您有效推廣產品或服務&#xff0c;提升市場份額。教您掌握穩定擴散繪畫技巧&#xff0c;開啟藝術創作新篇章。

Opencv 之ORB特征提取與匹配API簡介及使用例程

Opencv 之ORB特征提取與匹配API簡介及使用例程 ORB因其速度較快常被用于視覺SLAM中的位姿估計、視覺里程、圖像處理中的特征提取與匹配及圖像拼接等領域本文將詳細給出使用例程及實現效果展示 1. API 簡介 創建 static Ptr<ORB> cv::ORB::create (int nfeatures 500…

無涯教程-Perl - use函數

描述 此函數將MODULE導出的所有功能(或僅LIST引用的功能)導入當前包的名稱空間。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在當前腳本上強加編譯器指令(編譯指示),盡管從本質上講它們只是模塊。 請注意,use語句在編譯時進行判斷。在…

springcloud3 hystrix實現服務熔斷的案例配置3

一 hystrix的熔斷原理 1.1 hystrix的熔斷原理 在springcloud的框架里&#xff0c;熔斷機制是通過hystrix實現&#xff0c;hystrix會監控服務之間的調用。當失敗調用達到一定的閾值&#xff0c;默認是5s內失敗20次&#xff0c;就會啟用hystrix的熔斷機制&#xff0c;使用命Hy…

神經網絡基礎-神經網絡補充概念-44-minibatch梯度下降法

概念 小批量梯度下降法&#xff08;Mini-Batch Gradient Descent&#xff09;是梯度下降法的一種變體&#xff0c;它結合了批量梯度下降&#xff08;Batch Gradient Descent&#xff09;和隨機梯度下降&#xff08;Stochastic Gradient Descent&#xff09;的優點。在小批量梯…

Apache Doris大規模數據使用指南

目錄 發展歷史 架構介紹 彈性MPP架構-極簡架構 邏輯架構 基本訪問架構 分區 創建單分區表

【C++ 記憶站】缺省參數

文章目錄 缺省參數的概念缺省參數的分類1、全缺省參數2、半缺省參數 缺省參數實際應用場景 缺省參數的概念 缺省參數是聲明或定義函數時為函數的參數指定一個缺省值。在調用該函數時&#xff0c;如果沒有指定實參則采用該形參的缺省值&#xff0c;否則使用指定的實參 正常調用一…

音頻解碼及如何在Java實現

本人并不干這個&#xff0c;但是被迫下水了解了一下這個&#xff0c;稍微做了一下整理。再就是感覺現在網上以及ChatGPT在這方面給出的答案太水了&#xff0c;在此開辟一篇。無意放出代碼&#xff0c;這里只介紹一些可能重要的點。 本來以為有了ChatGPT寫這些就沒有必要了&…