介绍一位我们的老朋友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中。