图像角点特征检测-opencv、python

介绍一位我们的老朋友Lena(截图只有1/4,this picture contains nudity http://www.lenna.org/):

import cv2
import matplotlib.pyplot as plt

# opencv图像格式为BGR,历史原因,用cv2.cvtColor转成rgb
lena_bgr = cv2.imread('img/lena_full.jpg')
lena_rgb= cv2.cvtColor(lena_bgr, cv2.COLOR_BGR2RGB)

plt.figure(figsize=(6, 6))
# 等同于 plt.subplot(1,2,1)
plt.subplot(121)
plt.imshow(lena_bgr)
plt.subplot(122)
plt.imshow(lena_rgb)
plt.show()

角点是图像的一个很大的特征,角点检测是图像识别的一项基本内容,目标识别、运行检测、图像匹配、视频追踪等等都会用到。检测方法如harris、shi-tomas(前者的改进)。
展示Harris,借助cv2.cornerHarris,它只能处理灰度图像:

import cv2
import matplotlib.pyplot as plt

lena_bgr = cv2.imread('img/lena.jpg')
lena_gray= cv2.cvtColor(lena_bgr, cv2.COLOR_BGR2GRAY)

# 图像,像素领域大小blockSize,孔径参数ksize,自由参数k
corners = cv2.cornerHarris(lena_gray, 2, 3, 0.04)

plt.imshow(corners, cmap='gray')
plt.show()

SIFT

scale-invariant feature transform尺度不变特征变换,不受方向和尺度的变化影响。先检测关键点,在计算关键点的特征值。SIFT目前受法律保护,一移到了opencv-contri

import cv2
import matplotlib.pyplot as plt
import numpy as np

lena_bgr = cv2.imread('img/lena.jpg')
lena_rgb = cv2.cvtColor(lena_bgr, cv2.COLOR_RGB2BGR)

# 由于版本和专利问题,这行内容不一定成功
sift = cv2.SIFT_create()
# kp关键点,des特征描述
kp, des = sift.detectAndCompute(lena_rgb, None)

# 一个图像大小的0数组
lena_kp = np.zeros_like(lena_rgb)
# flag给角点画圆圈标记
cv2.drawKeypoints(lena_rgb, kp, lena_kp, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(lena_kp)
plt.show()

print(len(kp))
print(type(kp))
print(des.shape)

kp长度、kp类型、des维度:

259
<class 'list'>
(259, 128)

SUFT

speeded up rebust features加速健壮特征,比SIFT快。SIFT和SUFT受法律保护,移入到opencv_contrib中。

posted @ 2021-03-05 10:41  foxerz  阅读(477)  评论(0编辑  收藏  举报