訂閱
糾錯(cuò)
加入自媒體

教你使用OpenCV對(duì)圖像進(jìn)行特征檢測(cè)、描述和匹配

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

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

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

1. 特征檢測(cè)算法

1.1 Harris角點(diǎn)檢測(cè)Harris角點(diǎn)檢測(cè)算法用于檢測(cè)輸入圖像中的角點(diǎn)。該算法有三個(gè)主要步驟。確定圖像的哪個(gè)部分的強(qiáng)度變化很大,因?yàn)榻锹涞膹?qiáng)度變化很大。它通過在整個(gè)圖像中移動(dòng)一個(gè)滑動(dòng)窗口來實(shí)現(xiàn)這一點(diǎn)。對(duì)于識(shí)別的每個(gè)窗口,計(jì)算一個(gè)分值 R。對(duì)分?jǐn)?shù)應(yīng)用閾值并標(biāo)記角點(diǎn)。這是該算法的 Python 實(shí)現(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 角點(diǎn)檢測(cè)器

這是另一種角點(diǎn)檢測(cè)算法。它的工作原理類似于哈里斯角檢測(cè)。這里唯一的區(qū)別是 R 值的計(jì)算。該算法還允許我們找到圖像中最好的 n 個(gè)角。讓我們看看 Python 的實(shí)現(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 算法的輸出。這里檢測(cè)到前 20 個(gè)角。

下一個(gè)是尺度不變特征變換。

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

用于檢測(cè)角、斑點(diǎn)、圓等。它還用于縮放圖像。

考慮這三個(gè)圖像。盡管它們?cè)陬伾⑿D(zhuǎn)和角度上有所不同,但你知道這是芒果的三種不同圖像。計(jì)算機(jī)如何能夠識(shí)別這一點(diǎn)?在這種情況下,Harris 角點(diǎn)檢測(cè)和 Shi-Tomasi 角點(diǎn)檢測(cè)算法都失敗了。但 SIFT 算法在這里起著至關(guān)重要的作用。它可以從圖像中檢測(cè)特征,而不管其大小和方向。讓我們實(shí)現(xiàn)這個(gè)算法。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)的線表示。我們將看到下一個(gè)特征檢測(cè)算法。

1.4 加速魯棒特征(SURF)

SURF算法只是SIFT的升級(jí)版。以下是代碼實(shí)現(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)

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

2. 斑點(diǎn)檢測(cè)BLOB 

代表二進(jìn)制大對(duì)象。它指的是特定二值圖像中具有共同屬性的一組連接像素或區(qū)域。這些區(qū)域是 OpenCV 中的輪廓,具有一些額外的特征,如質(zhì)心、顏色、面積、均值和覆蓋區(qū)域中像素值的標(biāo)準(zhǔn)差。以下是代碼實(shí)現(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()
讓我們看看輸出。在這里,斑點(diǎn)被很好地檢測(cè)到。

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

3. 特征描述符算法

特征通常是圖像中的不同點(diǎn),描述符給出特征,因此它描述了所考慮的關(guān)鍵點(diǎn)。它提取該點(diǎn)周圍的局部鄰域,從而創(chuàng)建局部圖像塊并計(jì)算來自該局部塊的特征。3.1 定向梯度直方圖(HoG)在深度學(xué)習(xí)出現(xiàn)之前,HoG 是對(duì)象檢測(cè)應(yīng)用中最突出的特征描述符之一。HoG 是一種用于計(jì)算圖像局部中梯度方向出現(xiàn)的技術(shù)。讓我們實(shí)現(xiàn)這個(gè)算法。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)

下一個(gè)是BRIEF。

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

Brief 是流行的 SIFT 描述符的替代品,它們計(jì)算速度更快,更緊湊。讓我們看看它的實(shí)現(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)
這是結(jié)果。

3.3 定向快速旋轉(zhuǎn)簡(jiǎn)報(bào) (ORB)

ORB 是一種一次性面部識(shí)別算法。它目前正在你的手機(jī)和應(yīng)用程序中使用,例如 Google 照片,你可以在其中對(duì)人進(jìn)行分組,你看到的圖像是根據(jù)人分組的。這個(gè)算法不需要任何主要的計(jì)算。它不需要GPU。快速而簡(jiǎn)短。它適用于關(guān)鍵點(diǎn)匹配。圖像中不同區(qū)域的關(guān)鍵點(diǎn)匹配,如強(qiáng)度變化。下面是這個(gè)算法的實(shí)現(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. 特征匹配

特征匹配就像比較兩個(gè)圖像的特征,這兩個(gè)圖像可能在方向、視角、亮度上不同,甚至大小和顏色也不同。讓我們看看它的實(shí)現(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()
這是這個(gè)算法的結(jié)果。

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

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

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無評(píng)論

暫無評(píng)論

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

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