《數字圖像處理-OpenCV/Python》第17章:圖像的特征描述

《數字圖像處理-OpenCV/Python》第17章:圖像的特征描述


本書京東 優惠購書鏈接 https://item.jd.com/14098452.html
本書CSDN 獨家連載專欄 https://blog.csdn.net/youcans/category_12418787.html

在這里插入圖片描述


第17章:圖像的特征描述


特征檢測與匹配是計算機視覺的基本任務,包括檢測、描述和匹配三個相互關聯的步驟。廣泛應用于目標檢測、圖像檢索、視頻跟蹤和三維重建等諸多領域。
OpenCV提供了豐富的特征檢測和匹配算法,不僅繼承了cv::Feature2D 類,而且采用了統一的定義和封裝。


17.1 角點檢測之Harris算法

角是直線方向的快速變化,角點定義為兩條邊的交點,是簡單高效的特征。角點檢測(Corner Detection)是特征檢測的基礎,Harris算法是經典的角點檢測算法。


Harris角點檢測

Harris角點檢測算法的原理是,通過檢測窗口在圖像上移動,計算移動前后窗口中像素的灰度變化。角點是兩條邊的交點,其特征是檢測窗口沿任方向移動都會導致灰度的顯著變化。

Harris算法計算梯度的協方差矩陣M,協方差矩陣形狀為橢圓,長短半軸由特征值 ( λ 1 , λ 2 ) (λ_1, λ_2) (λ1?,λ2?)決定,方向由特征向量決定。定義如下的角點響應函數 R。

R = d e t ( M ) ? k [ t r a c e ( M ) ] 2 d e t ( M ) = λ 1 ? λ 2 t r a c e ( M ) = λ 1 + λ 2 \begin{aligned}R =& det(M) - k [trace(M)]^2 \\&det(M) = \lambda _1 * \lambda _2 \\&trace(M) = \lambda _1 + \lambda _2\end{aligned} R=?det(M)?k[trace(M)]2det(M)=λ1??λ2?trace(M)=λ1?+λ2??

角點響應 R 只與矩陣 M 的特征值 λ 1 , λ 2 \lambda _1,\lambda _2 λ1?λ2? 有關,可以用來判斷區域是拐角、邊緣還是平坦:

  • λ 1 , λ 2 \lambda _1,\lambda _2 λ1?λ2? 較小時, ∣ R ∣ |R| R 較小,即各個方向上灰度基本不變,表明檢測器處于平坦區域;
  • λ 1 > > λ 2 \lambda _1 >> \lambda _2 λ1?>>λ2? λ 2 > > λ 1 \lambda _2 >> \lambda _1 λ2?>>λ1? 時, R < 0 R <0 R<0 ,即灰度在某個方向變化,但在其正交方向不變化,表明檢測器處于邊緣區域;
  • λ 1 , λ 2 \lambda _1,\lambda _2 λ1?λ2? 較大且數值相當時,灰度在某個方向及其正交方向都變化強烈,表明存在角點或孤立點。

Harris角點檢測算法的重復性好、檢測效率高,應用比較廣泛。

Shi-Tomas角點檢測

Shi-Tomas算法是對Harris角點檢測算法的改進,區別在于將角點響應函數修改如下。

R = m i n ( λ 1 , λ 2 ) R = min(\lambda _1 , \lambda _2) R=min(λ1?,λ2?)
只有當梯度協方差矩陣M的特征值 λ 1 , λ 2 λ_1, λ_2 λ1?,λ2? 都大于閾值時,才判定為角點。


OpenCV的角點檢測函數

在OpenCV中提供了函數cv.cornerEigenValsAndVecs計算圖像或矩陣的特征值和特征向量,函數cv.cornerMinEigenVal計算梯度矩陣的最小特征值,函數cv.cornerHarris實現Harris角點檢測。

函數原型

cv.cornerHarris(src, blockSize, ksize, k[, dst, borderType]) → dst
cv.cornerEigenValsAndVecs(src, blockSize, ksize[, dst, borderType]) → dst
cv.cornerMinEigenVal(src, blockSize[, dst, ksize, borderType]) → dst

參數說明

? src:輸入圖像,單通道,數據類型為CV_8U或浮點數類型。
? dst:輸出圖像,角點響應函數,大小與src相同,格式為CV_32FC1。
? blockSize:檢測器的滑動窗口尺寸,為整數。
? ksize:Sobel梯度算子的孔徑,即卷積核的大小,為整數。
? k:Harris角點響應函數的調節參數,通常取0.04~0.06。
? borderType:邊界擴充的類型,不支持BORDER_WRAP。

注意問題
⑴ 函數cv.cornerHarris返回值是如下的Harris的角點響應圖像R。
R = d s t ( x , y ) = d e t ( M ( x , y ) ) ? k ? [ t r a c e ( M ( x , y ) ) ] 2 R=dst(x,y)=det(M(x,y))-k*[trace(M(x,y))]^2 R=dst(x,y)=det(M(x,y))?k?[trace(M(x,y))]2
從角點響應圖像中篩選大于檢測閾值、且為局部最大值的點,就是圖像的角點。檢測閾值通常可以設為最大響應值的0.01~0.1。
⑵ 函數cv.cornerMinEigenVal與cv.cornerEigenValsAndVecs類似,區別在于它計算和保存矩陣M的最小特征值,即 m i n ( λ 1 , λ 2 ) min(λ_1 ,λ_2) min(λ1?,λ2?)


在OpenCV中提供了函數cv.goodFeaturesToTrack實現Shi-Tomas角點檢測。

先使用cornerHarris或cornerMinEigenVal計算角點響應函數,最小特征值小于閾值的角點被剔除;并進行非最大值抑制,只保留(3×3)鄰域中的局部最大值;最后按照角點響應函數的大小排序,輸出前N個結果。

函數原型

cv.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners, mask, blockSize, useHarrisDetector, k=0.04]) → corners

參數說明

? src:輸入圖像,單通道,數據類型為CV_8U或浮點數類型。
? corners:二維點向量集合的坐標(x,y),形如(n,1,2)的Numpy數組,浮點數。
? maxCorners:角點數量的最大值N,整數。
? qualityLevel:角點閾值系數,浮點數,取值范圍0.0~1.0。
? minDistance:角點之間的最小歐式距離。
? mask:掩模圖像,指定檢測角點的區域,可選項。
? blockSize:檢測器的滑動窗口尺寸,可選項,默認值為3。
? k:Harris角點響應函數的調節參數,可選項,默認值0.04。
? useHarrisDetector:計算角點響應的方法,默認值false,使用cornerMinEigenVal計算,true表示使用cornerHarris計算。

注意問題

⑴ 輸出參數corners是形如(n,1,2)的Numpy數組,表示檢測到n個角點的坐標(x,y)。
⑵ 檢測閾值是閾值系數qualityLevel與最大響應值的乘積,小于閾值的角點都被拒絕。例如,最大響應為1500,系數為0.1,則檢測閾值為150。
⑶ 剔除間距小于maxDistance的角點,實現非最大值抑制方法,避免重復的鄰近角點。


【例程1701】角點檢測之Harris算法和Shi-Tomas算法

本例程示例Harris角點檢測算法和Shi-Tomas角點檢測算法的使用。
Harris角點檢測函數的返回值是角點響應圖像,需要進行閾值處理才能得到角點坐標。Shi-Tomas角點檢測函數的返回值是角點坐標。


# 【1701】角點檢測之Harris算法和Shi-Tomas算法
import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltif __name__ == '__main__':img = cv.imread("../images/Fig1201.png", flags=1)gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)# Harris 角點檢測算法dst = cv.cornerHarris(gray, 5, 3, k=0.04)  # 角點響應圖像,坐標(y,x)# Harris[dst>0.1*dst.max()] = [0,0,255]  # 篩選角點,紅色標記stack = np.column_stack(np.where(dst>0.2*dst.max()))  # 閾值篩選角點 (n,2)corners = stack[:, [1, 0]]  # 調整坐標次序:(y,x) -> (x,y)print("num of corners by Harris: ", corners.shape)imgHarris = img.copy()for point in corners: cv.drawMarker(imgHarris, point, (0,0,255), cv.MARKER_CROSS, 10, 1)  # 在點(x,y)標記# Shi-Tomas 角點檢測算法maxCorners, qualityLevel, minDistance = 100, 0.1, 5corners = cv.goodFeaturesToTrack(gray, maxCorners, qualityLevel, minDistance)  # 角點坐標 (x,y)corners = np.squeeze(corners).astype(np.int)  # 檢測到的角點 (n,1,2)->(n,2)print("num of corners by Shi-Tomas: ", corners.shape[0])imgShiTomas = np.copy(img)for point in corners:  # 注意坐標次序cv.drawMarker(imgShiTomas, (point[0], point[1]), (0,0,255), cv.MARKER_CROSS, 10, 2)  # 在點(x,y)標記plt.figure(figsize=(9, 3.3))plt.subplot(131), plt.title("1. Original")plt.axis('off'), plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(132), plt.title("2. Harris corners")plt.axis('off'), plt.imshow(cv.cvtColor(imgHarris, cv.COLOR_BGR2RGB))plt.subplot(133), plt.title("3. Shi-tomas corners")plt.axis('off'), plt.imshow(cv.cvtColor(imgShiTomas, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()  

運行結果:
num of corners by Harris: 589
num of corners by Shi-Tomas: 66

在這里插入圖片描述

圖17-1 Harris角點檢測和Shi-Tomas角點檢測


程序說明:

⑴ 程序運行結果如圖17-1所示。子圖1是原始圖像,子圖2是Harris角點檢測的結果,子圖3是Shi-Tomas角點檢測的結果。
⑵ 運行結果表明,Harris算法函數檢測到的角點數量遠大于Shi-Tomas算法函數的結果。這是由于角點周圍像素的響應值都很高,都被識別為角點,因此Harris函數會檢測到大量重復的角點。


版權聲明:
youcans@xupt 原創作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/140212758)
Copyright 2024 youcans, XUPT
Crated:2024-07-05

《數字圖像處理-OpenCV/Python》 獨家連載專欄 : https://blog.csdn.net/youcans/category_12418787.html

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

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

相關文章

javascript v8編譯器的使用記錄

我的機器是MacOS Mx系列。 一、v8源碼下載構建 1.1 下載并更新depot_tools git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git export PATH/path/to/depot_tools:$PATH 失敗的話可能是網絡問題&#xff0c;可以試一下是否能ping通&#xff0c;連…

【代碼隨想錄_Day25】452. 用最少數量的箭引爆氣球 435. 無重疊區間 763. 劃分字母區間

Day25 OK&#xff0c;今日份的打卡&#xff01;第二十五天 以下是今日份的總結用最少數量的箭引爆氣球無重疊區間劃分字母區間 以下是今日份的總結 用最少數量的箭引爆氣球無重疊區間劃分字母區間 今天的題目難度不低&#xff0c;而且非常的有意思&#xff0c;盡量還是寫一些…

imx6ull/linux應用編程學習(11)CAN應用編程基礎

關于裸機的can通信&#xff0c;會在其他文章發&#xff0c;這里主要講講linux上的can通信。 與I2C,SPI等同步通訊方式不同&#xff0c;CAN通訊是異步通訊&#xff0c;也就是沒有時鐘信號線來保持信號接收同步&#xff0c;也就是所說的半雙工&#xff0c;無法同時發送與接收&…

python項目常見使用的傳參調試方法

簡介 你是否經常遇到下載的github開源知名項目&#xff0c;不知如何調試&#xff1f;只知道按說明的命令行運行&#xff1f;遇到異常或想改造也無從下手&#xff1f;這篇文檔章將指導你如何入手調試別人的大型開源項目。 常見項目使用說明及代碼如何調試 常見情況一 使用說…

16.【C語言】初識常見關鍵字 上

1.關鍵字由C語言自帶&#xff0c;不能自創 2.關鍵字不作變量名 3.關鍵字舉例&#xff1a; auto自動&#xff1a;每個局部變量都由auto修飾&#xff0c;含義&#xff1a;自動創建&#xff0c;自動銷毀 auto int a0;等價于int a0; exturn:申明外部符號 register:寄存器關鍵字…

數據治理的制勝法寶:篩斗數據技術在現代企業管理中的應用

數據治理的制勝法寶&#xff1a;篩斗數據技術在現代企業管理中的應用 在當今這個數據驅動的時代&#xff0c;企業管理的效率和競爭力越來越依賴于對數據的精準把握和高效利用。然而&#xff0c;隨著企業規模的擴大和業務復雜度的增加&#xff0c;數據治理成為了一個亟需解決的…

EasyExcel 單元格根據圖片數量動態設置寬度

在使用 EasyExcel 導出 Excel 時&#xff0c;如果某個單元格是圖片內容&#xff0c;且存在多張圖片&#xff0c;此時就需要單元格根據圖片數量動態設置寬度。 經過自己的研究和實驗&#xff0c;導出效果如下&#xff1a; 具體代碼如下&#xff1a; EasyExcel 版本 <depen…

Haxm安裝失敗的解決辦法

確認你的處理器是否是Intel的&#xff0c;如果是AMD那就無法安裝&#xff0c;如果是Intel的&#xff0c;再確認是否支持V1T 如果處理器是Intel的且支持VT&#xff0c;在開機時進入BIOS界面&#xff0c;不同的品牌進入BIOS的方法各不相同&#xff0c;通常是F2/F12/delete些&…

Python爬蟲零基礎實戰,簡潔實用!

1.爬蟲簡介 簡單來講&#xff0c;爬蟲就是一個探測機器&#xff0c;它的基本操作就是模擬人的行為去各個網站溜達&#xff0c;點點按鈕&#xff0c;查查數據&#xff0c;或者把看到的信息背回來。就像一只蟲子在一幢樓里不知疲倦地爬來爬去。 你可以簡單地想象&#xff1a;每個…

論文學習 --- RL Maximumdiffusion reinforcement learning

前言 個人拙見,如果我的理解有問題歡迎討論 (●′ω`●) 文章出處:https://techxplore.com/news/2024-05-random-robots-reliable-ai-algorithm.html 研究背景 最大擴散強化學習(MaxDiff RL)是一種創新的強化學習方法,借鑒了統計力學中的擴散過程和最大熵原理。該方法在…

Hadoop的namenode啟動不起來

1、 排查原因 Initialization failed for Block pool (Datanode Uuid a5d441af-d074-4758-a3ff-e1563b709267) service to node1/192.168.88.101:8020. Exiting. java.io.IOException: Incompatible clusterIDs in /data/dn: namenode clusterID CID-674c5515-3fe1-4a9c-881d…

AIGC技術加持,英智法律智能體來了!

法律行業作為一個由大量文件積累的領域&#xff0c;非常適合由數據驅動的AI智能體。人工智能在法律領域的應用已經成為不可逆轉的趨勢。根據最高人民法院發布的《關于規范和加強人工智能司法應用的意見》&#xff0c;國家鼓勵在司法領域廣泛應用人工智能技術&#xff0c;以提高…

四端口千兆以太網交換機與 SFP 擴展功能

在數字化時代&#xff0c;網絡基礎設施的重要性日益凸顯&#xff0c;它是企業和個人取得成功的關鍵支撐。配備 SFP 插槽的 4 端口千兆以太網交換機提供了一種靈活且可擴展的網絡解決方案&#xff0c;能夠應對快速的數據傳輸、低延遲以及不斷增長的帶寬需求。本篇文章深入探討了…

IP地址配置

1.為虛擬機配置IP地址&#xff0c;網關&#xff0c;DNS 例如&#xff1a;手動給虛擬機配置IP地址為 192.168.5.50/24&#xff1b;網關地址為&#xff1a;192.168.5.2&#xff1b;DNS地址為&#xff1a;192.168.5.2 解題步驟如下&#xff1a; #配置IP地址 [rootlocalhost ~]#…

大廠都在加急招人的大模型LLM,到底怎么學?

大模型如何入坑&#xff1f; 想要完全了解大模型&#xff0c;你首先要了解市面上的LLM大模型現狀&#xff0c;學習Python語言、Prompt提示工程&#xff0c;然后深入理解Function Calling、RAG、LangChain 、Agents等 很多人不知道想要自學大模型&#xff0c;要按什么路線學&a…

【網絡安全】第4講 身份認證技術(筆記)

一、身份認證技術概述 1、身份認證 是網絡安全的第一道防線。是最基本的安全服務&#xff0c;其他的安全服務都依賴于它。在物聯網應用系統中&#xff0c;身份認證也是整個物聯網應用層信息安全體系的基礎。 2、基本身份認證技術 &#xff08;1&#xff09;雙方認證 是一種雙…

人員定位系統在監獄中的應用也同樣重要!

監獄管理應用人員定位系統怎么樣&#xff1f;新銳科創告訴你&#xff0c;人員定位系統在監獄中的應用也是很重要的&#xff0c;運用這種新型的定位系統&#xff0c;來起到管理監獄人員的作用。 人員定位系統 在監獄中&#xff0c;關押著大量的犯人&#xff0c;所以&#xff0c…

拓撲Transformer模型TopoFormer:革新藥物研發的智能鑰匙

在藥物研發的浩瀚征途中&#xff0c;每一步都充滿了挑戰與未知。從發現潛在的治療靶點&#xff0c;到篩選出有效的藥物分子&#xff0c;再到通過臨床試驗驗證其安全性和有效性&#xff0c;這一過程往往耗時漫長且成本高昂。然而&#xff0c;隨著人工智能技術的飛速發展&#xf…

昇思25天學習打卡營第15天|ResNet50圖像分類

學AI還能贏獎品&#xff1f;每天30分鐘&#xff0c;25天打通AI任督二脈 (qq.com) ResNet50圖像分類 圖像分類是最基礎的計算機視覺應用&#xff0c;屬于有監督學習類別&#xff0c;如給定一張圖像(貓、狗、飛機、汽車等等)&#xff0c;判斷圖像所屬的類別。本章將介紹使用ResN…

【JAVA入門】Day13 - 代碼塊

【JAVA入門】Day13 - 代碼塊 文章目錄 【JAVA入門】Day13 - 代碼塊一、局部代碼塊二、構造代碼塊三、靜態代碼塊 在 Java 中&#xff0c;兩個大括號 { } 中間的部分叫一個代碼塊&#xff0c;代碼塊又分為&#xff1a;局部代碼塊、構造代碼塊、靜態代碼塊三種。 一、局部代碼塊…