您当前的位置: 首页 >  Python
  • 1浏览

    0关注

    265博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python图像处理,cv2模块,OpenCV实现检索图片

可可爱爱的程序员 发布时间:2021-12-11 14:28:10 ,浏览量:1

前言

利用Python实现OpenCV实现检索图片。废话不多说。

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

cv2模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

OpenCV可以检测图像的主要特征,然后提取图像的特征,使其成为图像描述符

这些图像特征,也就是图像描述符,可以作为图像搜索的数据库

1.jpg

特征检测算法

这里简单介绍一下OpenCV常用的几种特征检测和提取算法。

Harris、FAST:用于检测角点的。

SIFT、SURF、BRIEF:用于检测斑点的。

ORB:FAST算法和BRIEF算法的结合体。\

检测和提取的工作做完了,就是特征匹配。

主要是「暴力匹配法」和「FLANN匹配法」。

提了好几次特征了,那么什么是图像的特征呢?

图像特征就是指有意义的图像区域,具有独特性或易于识别性,比如角点、斑点以及高密度区。

角点可以通过OpenCV的cornerHarris来识别。

「SIFT」则是一种与图像比例无关的角点检测方法,尺度不变特征变换。

采用DoG和SIFT来检测关键点并提取关键点周围的特征。

「SURF」特征检测算法,则是采用Hessian算法检测关键点,使用SURF提取特征。

图像检索

采用FLANN匹配,近似最近邻的快速库

原始图片如下,为微博的Logo

2.jpg

目标图片如下,包含新浪微博的名称

3.jpg

具体代码如下

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()
复制代码

输出展示结果

4.jpg

看到原始图片上的logo和目标图片上的logo匹配上,大家也可以试一试哦~源码在此处

 

关注
打赏
1656598245
查看更多评论
立即登录/注册

微信扫码登录

0.1779s