前言
利用Python實現OpenCV實現邊緣檢測。廢話不多說。
讓我們愉快地開始吧~
開發工具
Python版本: 3.6.4
相關模塊:
cv2模塊;
以及一些Python自帶的模塊。
環境搭建
安裝Python並添加到環境變量,pip安裝需要的相關模塊即可。
OpenCV可以檢測圖像的主要特徵,然後提取圖像的特徵,使其成爲圖像描述符
這些圖像特徵,也就是圖像描述符,可以作爲圖像搜索的數據庫
特徵檢測算法
這裏簡單介紹一下OpenCV常用的幾種特徵檢測和提取算法。
Harris、FAST:用於檢測角點的。
SIFT、SURF、BRIEF:用於檢測斑點的。
ORB:FAST算法和****BRIEF****算法的結合體。\
檢測和提取的工作做完了,就是特徵匹配。
主要是「暴力匹配法」和「FLANN匹配法」。
提了好幾次特徵了,那麼什麼是圖像的特徵呢?
圖像特徵就是指有意義的圖像區域,具有獨特性或易於識別性,比如角點、斑點以及高密度區。
角點可以通過OpenCV的cornerHarris來識別。
「SIFT」則是一種與圖像比例無關的角點檢測方法,尺度不變特徵變換。
採用DoG和SIFT來檢測關鍵點並提取關鍵點周圍的特徵。
「SURF」特徵檢測算法,則是採用Hessian算法檢測關鍵點,使用SURF提取特徵。
圖像檢索
採用FLANN匹配,近似最近鄰的快速庫
原始圖片如下,爲微博的Logo
目標圖片如下,包含新浪微博的名稱
具體代碼如下
import cv2
good = []
# 原始圖片
queryImage = cv2.imread('wb1.jpg', 0)
# 目標圖片
trainingImage = cv2.imread('wb2.jpg', 0)
# 創建SIFT對象(特徵檢測器),並計算灰度圖像(描述符)
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(queryImage, None)
kp2, des2 = sift.detectAndCompute(trainingImage, None)
# 設置FLANN匹配器參數
FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
searchParams = dict(checks=50)
# FLANN匹配器
flann = cv2.FlannBasedMatcher(indexParams, searchParams)
# K-最近鄰匹配
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]
good.append(m)
# 圖像參數
drawParams = dict(matchColor=(0, 255, 0),
singlePointColor=(255, 0, 0),
matchesMask=matchesMask,
flags=0)
# 最終結果
resultImage = cv2.drawMatchesKnn(queryImage, kp1, trainingImage, kp2, matches, None, **drawParams)
# 檢測是否匹配
if len(good) > 10:
print('It is a match!')
# 設置顯示窗口
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 840, 480)
cv2.imshow('img', resultImage)
while True:
if cv2.waitKey(0) & 0xff == ord('q'):
break
cv2.destroyAllWindows()
輸出展示結果
看到原始圖片上的logo和目標圖片上的logo匹配上