Python-OpenCV中的圖像處理-圖像特征
- 圖像特征
- Harris角點檢測
- 亞像素級精度的角點檢測
- Shi-Tomasi角點檢測
- SIFT(Scale-Invariant Feature Transfrom)
- SURF(Speeded-Up Robust Features)
圖像特征
- 特征理解
- 特征檢測
- 特征描述
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()