资源技术动态Python-OpenCV 16. 图像特征检测与描述算法

Python-OpenCV 16. 图像特征检测与描述算法

2019-12-07 | |  91 |   0

原标题:Python-OpenCV 16. 图像特征检测与描述算法

来源:今日头条         链接:https://www.toutiao.com/a6756809546125017613/

一、Harris Corner Detection 触点检测

Harris角点检测由Chris Harris和Mike Stephens在1988年提出,是通过数学计算在图像上发现角点特征的一种算法,而且其具有旋转不变性的特质。OpenCV中的Shi-Tomasi角点检测就是基于Harris角点检测改进算法。

1. 算法步骤:

算法详细步骤

  1. 计算图像X方向与Y方向的一阶高斯偏导数Ix与Iy

  2. 根据第一步结果得到Ix^2 , Iy^2与Ix*Iy值

  3. 高斯模糊第二步三个值得到Sxx, Syy, Sxy

  4. 定义每个像素的Harris矩阵,计算出矩阵的两个特质值

  5. 计算出每个像素的R值

  6. 使用3X3或者5X5的窗口,实现非最大值压制

  7. 根据角点检测结果计算,最提取到的关键点以绿色标记,显示在原图上。

OpenCV的CornerHarris函数: cv2.cornerHarris(src=gray, blockSize=9, ksize=23, k=0.04)
参数说明:

  • src - 数据类型为 float32 的输入图像。

  • blockSize - 角点检测中要考虑的领域大小。

  • ksize - Sobel 求导中使用的窗口大小

  • k - Harris 角点检测方程中的自由参数,取值参数为 [0,04,0.06].

示例代码:

# -*- coding: utf-8 -*-
# !/usr/bin/python
import cv2
import numpy as np

filename = 'test.jpg'
img = cv2.imread(filename)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)
dst = cv2.cornerHarris(gray, 2, 3, 0.04)

dst = cv2.dilate(dst, None)

# Threshold for an optimal value, it may vary depending on the image.
img[dst > 0.01 * dst.max()] = [0, 0, 255]

cv2.imshow('dst', img)
if cv2.waitKey(0) & 0xff == 27:
 cv2.destroyAllWindows()

image.png


二、Shi-Tomasi角点检测

Shi-Tomasi 算法是Harris 算法的改进。Harris 算法最原始的定义是将矩阵 M 的行列式值与 M 的迹相减,再将差值同预先给定的阈值进行比较。后来Shi 和Tomasi 提出改进的方法,若两个特征值中较小的一个大于最小阈值,则会得到强角点。
corners = cv.goodFeaturesToTrack( image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]] )

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

img = cv.imread('t1.jpg')
src = cv.cvtColor(img, cv.COLOR_BGR2RGB)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
corners = cv.goodFeaturesToTrack(gray, 25, 0.01, 10)
corners = np.int0(corners)
for i in corners:
 x, y = i.ravel()
 cv.circle(img, (x, y), 3, 255, -1)

plt.subplot(1, 2, 1)
plt.title('src')
plt.imshow(src)
plt.subplot(1, 2, 2)
plt.title('corners')
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()

image.png

三、DOG和SIFT算法

  • DoG是对同一图像使用不同高斯滤波器所得的结果。

  • SIFT是通过一个特征向量来描述关键点周围区域的情况。

需要安装 opencv-contrib-python 库

import cv2

# 读取图片并灰度处理
imgpath = 'test.jpg'
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建SIFT对象
sift = cv2.xfeatures2d.SIFT_create()
# 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点
# descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。
keypoints, descriptor = sift.detectAndCompute(gray, None)

img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT,
 color=(51, 163, 236))

# 显示图片
cv2.imshow('sift_keypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


四、SURF特征检测算法

比SIFT算法快,并吸收了SIFT算法的思想。SURF采用Hessian算法检测关键点,而SURF是提取特征,这个与SIFT很像。Opencv的SURF类是Hessian算法和SURF算法组合。

import cv2

# 读取图片并灰度处理
imgpath = 'test.jpg'
img = cv2.imread(imgpath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建SURF对象,对象参数float(4000)为阈值,阈值越高,识别的特征越小。
sift = cv2.xfeatures2d.SURF_create(float(4000))
# 将图片进行SURF计算,并找出角点keypoints,keypoints是检测关键点
# descriptor是描述符,这是图像一种表示方式,可以比较两个图像的关键点描述符,可作为特征匹配的一种方法。
keypoints, descriptor = sift.detectAndCompute(gray, None)

img = cv2.drawKeypoints(image=img, outImage=img, keypoints=keypoints, flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT,
 color=(51, 163, 236))

# 显示图片
cv2.imshow('sift_keypoints', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

其它还有 FAST、BRIEF、ORB等特征检测算法。

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:人工智能基础-张量的常用描述及图像表征

下一篇:技术综述-你真的了解图像分类吗?

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...