訂閱
糾錯
加入自媒體

教你使用OpenCV對圖像進行特征檢測、描述和匹配

介紹在本文中,我將討論使用 OpenCV 進行圖像特征檢測、描述和特征匹配的各種算法。首先,讓我們看看什么是計算機視覺,OpenCV 是一個開源計算機視覺庫。當人類看到這張圖片時會發(fā)生什么?

他將能夠識別圖像中的面孔。因此,簡單來說,計算機視覺就是讓計算機能夠像人類一樣查看和處理視覺數(shù)據(jù)。計算機視覺涉及分析圖像以產(chǎn)生有用的信息。

什么是特征?當你看到芒果圖像時,如何識別它是芒果?通過分析顏色、形狀和質(zhì)地,你可以說它是芒果。用于識別圖像的線索稱為圖像的特征。同樣,計算機視覺的功能是檢測圖像中的各種特征。我們將討論 OpenCV 庫中用于檢測特征的一些算法。

1. 特征檢測算法

1.1 Harris角點檢測Harris角點檢測算法用于檢測輸入圖像中的角點。該算法有三個主要步驟。確定圖像的哪個部分的強度變化很大,因為角落的強度變化很大。它通過在整個圖像中移動一個滑動窗口來實現(xiàn)這一點。對于識別的每個窗口,計算一個分值 R。對分數(shù)應用閾值并標記角點。這是該算法的 Python 實現(xiàn)。

import cv2
import numpy as np
imput_img = 'det_1.jpg'
ori = cv2.imread(imput_img)
image = cv2.imread(imput_img)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)
image[dst>0.01*dst.max()]=[0,0,255]
cv2.imshow('Original',ori)
cv2.imshow('Harris',image)
if cv2.waitKey(0) & 0xff == 27:
   cv2.destroyAllWindows()
這是輸出。

1.2 Shi-Tomasi 角點檢測器

這是另一種角點檢測算法。它的工作原理類似于哈里斯角檢測。這里唯一的區(qū)別是 R 值的計算。該算法還允許我們找到圖像中最好的 n 個角。讓我們看看 Python 的實現(xiàn)。import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('det_1.jpg')
ori = cv2.imread('det_1.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(gray,20,0.01,10)
corners = np.int0(corners)
for i in corners:
   x,y = i.ravel()
   cv2.circle(img,(x,y),3,255,-1)
cv2.imshow('Original', ori)
cv2.imshow('Shi-Tomasi', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
這是 Shi-Tomasi 算法的輸出。這里檢測到前 20 個角。

下一個是尺度不變特征變換。

1.3 尺度不變特征變換(SIFT)SIFT 

用于檢測角、斑點、圓等。它還用于縮放圖像。

考慮這三個圖像。盡管它們在顏色、旋轉和角度上有所不同,但你知道這是芒果的三種不同圖像。計算機如何能夠識別這一點?在這種情況下,Harris 角點檢測和 Shi-Tomasi 角點檢測算法都失敗了。但 SIFT 算法在這里起著至關重要的作用。它可以從圖像中檢測特征,而不管其大小和方向。讓我們實現(xiàn)這個算法。import numpy as np
import cv2 as cv
ori = cv.imread('det_1.jpg')
img = cv.imread('det_1.jpg')
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
sift = cv.SIFT_create()
kp, des = sift.detectAndCompute(gray,None)
img=cv.drawKeypoints(gray,kp,img,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv.imshow('Original',ori)
cv.imshow('SIFT',image)
if cv.waitKey(0) & 0xff == 27:
   cv.destroyAllWindows()
輸出如下所示。

你可以看到圖像中有一些線條和圓圈。特征的大小和方向分別用圓圈和圓圈內(nèi)的線表示。我們將看到下一個特征檢測算法。

1.4 加速魯棒特征(SURF)

SURF算法只是SIFT的升級版。以下是代碼實現(xiàn):import numpy as np
import cv2 as cv
ori =cv.imread('/content/det1.jpg')
img = cv.imread('/content/det1.jpg')
surf = cv.xfeatures2d.SURF_create(400)
kp, des = surf.detectAndCompute(img,None)
img2 = cv.drawKeypoints(img,kp,None,(255,0,0),4)
cv.imshow('Original', ori)
cv.imshow('SURF', img2)

接下來,我們將看到如何提取另一個名為 bob 的特征。

2. 斑點檢測BLOB 

代表二進制大對象。它指的是特定二值圖像中具有共同屬性的一組連接像素或區(qū)域。這些區(qū)域是 OpenCV 中的輪廓,具有一些額外的特征,如質(zhì)心、顏色、面積、均值和覆蓋區(qū)域中像素值的標準差。以下是代碼實現(xiàn):import cv2
import numpy as np;
ori = cv2.imread('det_1.jpg')
im = cv2.imread("det_1.jpg", cv2.IMREAD_GRAYSCALE)
detector = cv2.SimpleBlobDetector_create()
keypoints = detector.detect(im)
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.a(chǎn)rray([]), (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow('Original',ori)
cv2.imshow('BLOB',im_with_keypoints)
if cv2.waitKey(0) & 0xff == 27:
   cv2.destroyAllWindows()
讓我們看看輸出。在這里,斑點被很好地檢測到。

現(xiàn)在,讓我們進入特征描述符算法。

3. 特征描述符算法

特征通常是圖像中的不同點,描述符給出特征,因此它描述了所考慮的關鍵點。它提取該點周圍的局部鄰域,從而創(chuàng)建局部圖像塊并計算來自該局部塊的特征。3.1 定向梯度直方圖(HoG)在深度學習出現(xiàn)之前,HoG 是對象檢測應用中最突出的特征描述符之一。HoG 是一種用于計算圖像局部中梯度方向出現(xiàn)的技術。讓我們實現(xiàn)這個算法。from skimage.feature import hog
import cv2
ori = cv2.imread('/content/det1.jpg')
img = cv2.imread("/content/det1.jpg")
_, hog_image = hog(img, orientations=8, pixels_per_cell=(16, 16),
                   cells_per_block=(1, 1), visualize=True, multichannel=True)
cv2.imshow('Original', ori)
cv2.imshow('HoG', hog_image)

下一個是BRIEF。

3.2 二元魯棒獨立基本特征(BRIEF)

Brief 是流行的 SIFT 描述符的替代品,它們計算速度更快,更緊湊。讓我們看看它的實現(xiàn)。import numpy as np
import cv2 as cv
ori = cv.imread('/content/det1.jpg')
img = cv.imread('/content/det1.jpg',0)
star = cv.xfeatures2d.StarDetector_create()
brief = cv.xfeatures2d.BriefDescriptorExtractor_create()
kp = star.detect(img,None)
kp, des = brief.compute(img, kp)
print( brief.descriptorSize() )
print( des.shape )
img2 = cv.drawKeypoints(img, kp, None, color=(0, 255, 0), flags=0)
cv.imshow('Original', ori)
cv.imshow('BRIEF', img2)
這是結果。

3.3 定向快速旋轉簡報 (ORB)

ORB 是一種一次性面部識別算法。它目前正在你的手機和應用程序中使用,例如 Google 照片,你可以在其中對人進行分組,你看到的圖像是根據(jù)人分組的。這個算法不需要任何主要的計算。它不需要GPU。快速而簡短。它適用于關鍵點匹配。圖像中不同區(qū)域的關鍵點匹配,如強度變化。下面是這個算法的實現(xiàn)。import numpy as np
import cv2
ori = cv2.imread('/content/det1.jpg')
img = cv2.imread('/content/det1.jpg', 0)
orb = cv2.ORB_create(nfeatures=200)
kp = orb.detect(img, None)
kp, des = orb.compute(img, kp)
img2 = cv2.drawKeypoints(img, kp, None, color=(0, 255, 0), flags=0)
cv2.imshow('Original', ori)
cv2.imshow('ORB', img2)
這是輸出。

現(xiàn)在,讓我們看看特征匹配。

4. 特征匹配

特征匹配就像比較兩個圖像的特征,這兩個圖像可能在方向、視角、亮度上不同,甚至大小和顏色也不同。讓我們看看它的實現(xiàn)。import cv2
img1 = cv2.imread('/content/det1.jpg', 0)
img2 = cv2.imread('/content/88.jpg', 0)
orb = cv2.ORB_create(nfeatures=500)
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key=lambda x: x.distance)
match_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None)
cv2.imshow('original image', img1)
cv2.imshow('test image', img2)
cv2.imshow('Matches', match_img)
cv2.waitKey()
這是這個算法的結果。

尾注我希望你喜歡這篇文章。我已經(jīng)簡要介紹了各種特征檢測、描述和特征匹配技術。上述技術用于對象檢測、對象跟蹤和對象分類應用。當你開始練習時,真正的樂趣就開始了。所以,開始練習這些算法,在實際項目中實現(xiàn)它們,看看其中的樂趣。保持學習。

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內(nèi)容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容
文章糾錯
x
*文字標題:
*糾錯內(nèi)容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網(wǎng)安備 44030502002758號