熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了(三)

简介: 熟练掌握CV中最基础的概念:图像特征,看这篇万字的长文就够了(三)

BRIEF Features(二进制鲁棒独立的基本特征)

  • 二进制鲁棒的独立基本特征
  • 在很多情况下,在速度和识别率方面都优于其他快速描述子,如SURF和SIFT。

步骤:

  • 使用高斯核平滑图像
  • 转换为二进制特征向量

 

使用Opencv实现BRIEF

import numpyas npimport cv2from matplotlib import pyplot as pltimg = cv2.imread("imgs/chapter9/indoor.jpg", 1);
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# Initiate FAST detectorstar = cv2.xfeatures2d.StarDetector_create()kp = star.detect(gray,None)
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()keypoints, descriptors = brief.compute(gray, kp)
for i in keypoints:x,y = int(i.pt[0]), int(i.pt[1])cv2.circle(img,(x,y), 5,(0, 125, 125),-1)
plt.figure(figsize=(8, 8))plt.imshow(img[:,:,::-1]);plt.show()

image.png

BRISK Features(二进制鲁棒不变可扩展关键点特征)

Binary RobustIndependent Elementary Features.)原文给的这个BRISK全称应该是Binary Robust Invariant Scalable Keypoints

由三部分组成

  • 采样模式:在描述子周围的位置采样

image.png

  • 方向补偿:对关键点的方向和旋转进行某种机制的补偿。
  • 抽样对:构建最终描述符时要比较哪些对。

 

import numpy as npimport cv2from matplotlib import pyplot as pltimg = cv2.imread("imgs/chapter9/indoor.jpg", 1);
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
brisk = cv2.BRISK_create()keypoints, descriptors = brisk.detectAndCompute(gray, None)
for i in keypoints:x,y = int(i.pt[0]), int(i.pt[1])cv2.circle(img,(x,y), 5,(0, 125, 125),-1)
plt.figure(figsize=(8, 8))plt.imshow(img[:,:,::-1]);plt.show()

image.png

KAZE and Accelerated-KAZE featuresKAZE是日语风的谐音)

 

使用OpenCV实现KAZE


import numpyas npimport cv2from matplotlib import pyplot as pltimg = cv2.imread("imgs/chapter9/indoor.jpg", 1);
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
kaze = cv2.KAZE_create()keypoints, descriptors = kaze.detectAndCompute(gray, None)
for i in keypoints:x,y = int(i.pt[0]), int(i.pt[1])cv2.circle(img,(x,y), 5,(0, 125, 125),-1)
plt.figure(figsize=(8, 8))plt.imshow(img[:,:,::-1]);plt.show()

image.png

AKAZE Features

 

使用OpenCV实现AKAZE


import numpyas npimport cv2from matplotlib import pyplot as pltimg = cv2.imread("imgs/chapter9/indoor.jpg", 1);
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
akaze = cv2.AKAZE_create()keypoints, descriptors = akaze.detectAndCompute(gray, None)
for i in keypoints:x,y = int(i.pt[0]), int(i.pt[1])cv2.circle(img,(x,y), 5,(0, 125, 125),-1)
plt.figure(figsize=(8, 8))plt.imshow(img[:,:,::-1]);plt.show()

image.png


ORB Features

面向快速鲁棒的BRIEF特征

 

使用OpenCV实现Orb


import numpyas npimport cv2from matplotlib import pyplot as pltimg = cv2.imread("imgs/chapter9/indoor.jpg", 1)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
orb = cv2.ORB_create(500)keypoints, descriptors = orb.detectAndCompute(gray, None)
for i in keypoints:x,y = int(i.pt[0]), int(i.pt[1])cv2.circle(img,(x,y), 5,(0, 125, 125),-1)
plt.figure(figsize=(8, 8))plt.imshow(img[:,:,::-1])plt.show()

image.png

特征匹配

  • 用于识别多幅图像中的相似特征。
  • 用于目标检测。

方法

1.暴力算法

将图像1中的每个特征与图像2中的每个特征逐个进行匹配

2.基于FLANN(快速最近邻开源库)的匹配

  • 快速最近邻开源库
  • 它包含一组算法,这些算法针对大型数据集中的快速最近邻搜索和高维特征进行了优化。

使用Opencv实现特征匹配

 

'''
Using Brute-Force matching

'''


import numpy as npimport cv2from matplotlib import pyplot as plt
orb = cv2.ORB_create(500)
img1 = cv2.imread("imgs/chapter9/indoor_lamp.jpg", 1);img1 = cv2.resize(img1, (256, 256));gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY);
img2 = cv2.imread("imgs/chapter9/indoor.jpg", 1);img2 = cv2.resize(img2, (640, 480));gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY);
# find the keypoints anddescriptors with SIFTkp1, des1 = orb.detectAndCompute(img1,None)kp2, des2 = orb.detectAndCompute(img2,None)
# BFMatcher with default paramsbf = cv2.BFMatcher()matches = bf.knnMatch(des1,des2,k=2)
# Apply ratio testgood = []for m,n in matches:if m.distance< 0.75*n.distance:good.append([m])
# cv.drawMatchesKnn expects list oflists as matches.img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
plt.figure(figsize=(15, 15))plt.imshow(img3[:,:,::-1])plt.show()


image.png

使用Opencv实现基于Flann特征匹配

'''

Using Flann-based matching on ORB features

import numpy as np
import cv2
from matplotlibimport pyplot as plt
import imutils
orb = cv2.ORB_create(500)
img1 = cv2.imread("imgs/chapter9/indoor_lamp.jpg", 1);
img1 = cv2.resize(img1, (256, 256));
gray1 = cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY);
img2 = cv2.imread("imgs/chapter9/indoor.jpg", 1);
img2 = cv2.resize(img2, (640, 480));
gray2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY);
# find the keypoints and descriptors with SIFT
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# FLANN parameters
FLANN_INDEX_LSH = 6
index_params= dict(algorithm = FLANN_INDEX_LSH,
                   table_number = 6, # 12
                   key_size = 12,     # 20
                   multi_probe_level = 1) #2
search_params = dict(checks=50)   # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)
# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]
# ratio test as per Lowe's paperfor i,(m,n) in enumerate(matches):
    if m.distance < 0.7*n.distance:
        matchesMask[i]=[1,0]
draw_params = dict(matchColor = (0,255,0),
                   singlePointColor = (255,0,0),
                   matchesMask = matchesMask,
                   flags = cv2.DrawMatchesFlags_DEFAULT)
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params)
plt.figure(figsize=(15, 15))
plt.imshow(img3[:,:,::-1])
plt.show()

image.png

图像拼接

  • 图像拼接或照片拼接是将多个摄影图像中重叠的视野相结合,产生一个分段的全景图或高分辨率图像的过程。

image.png

 

使用OpenCV来实现图像拼接


from matplotlib import pyplot as plt
%matplotlib inline
import cv2
import numpy as np
import argparse
import sys
modes = (cv2.Stitcher_PANORAMA, cv2.Stitcher_SCANS)# read input imagesimgs = [cv2.imread("imgs/chapter9/left.jpeg", 1),cv2.imread("imgs/chapter9/right.jpeg", 1)]stitcher = cv2.Stitcher.create(cv2.Stitcher_PANORAMA)
status, pano = stitcher.stitch(imgs)f = plt.figure(figsize=(15,15))
f.add_subplot(1, 2, 1).set_title('Left Image')
plt.imshow(imgs[0][:,:,::-1])
f.add_subplot(1, 2, 2).set_title('Right Image')
plt.imshow(imgs[1][:,:,::-1])
plt.show()

image.png

plt.figure(figsize=(15, 15))plt.imshow(pano[:,:,::-1])plt.show()

image.png

image.png

目录
相关文章
|
算法 计算机视觉 索引
OpenCV(四十六):特征点匹配
OpenCV(四十六):特征点匹配
814 0
|
存储 缓存 Java
嵌入式系统中C++内存管理基本方法
嵌入式系统中C++内存管理基本方法
279 0
|
人工智能 计算机视觉 Python
【YOLOv8-Seg】实战二:LabVIEW+OpenVINO加速YOLOv8-seg实例分割
【YOLOv8-Seg】实战二:LabVIEW+OpenVINO加速YOLOv8-seg实例分割
1018 0
【YOLOv8-Seg】实战二:LabVIEW+OpenVINO加速YOLOv8-seg实例分割
|
1月前
|
数据采集 数据可视化 数据挖掘
从CSV到交互式地图:用Plotly Express可视化地理数据
交互式地图让数据“活”起来:通过悬停、点击、缩放直观探索地理信息。结合Python的Pandas与Plotly Express,仅需几行代码即可实现散点图、热力图、线路图等可视化,支持自定义样式、动态筛选与多图层叠加,广泛应用于商业分析、环境监测、物流追踪等领域,零基础也能快速上手的空间数据分析利器。
144 1
|
JavaScript 前端开发 开发者
jQuery 下载与快速入门指南
jQuery 下载与快速入门指南
783 0
|
10月前
|
算法 前端开发 定位技术
地铁站内导航系统解决方案:技术架构与核心功能设计解析
本文旨在分享一套地铁站内导航系统技术方案,通过蓝牙Beacon技术与AI算法的结合,解决传统导航定位不准确、路径规划不合理等问题,提升乘客出行体验,同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文档可前往文章最下方获取,如有项目合作及技术交流欢迎私信我们哦~
811 1
|
人工智能 监控 安全
AI浅谈:计算机视觉(CV)技术的优势和挑战
AI浅谈:计算机视觉(CV)技术的优势和挑战
630 1
|
机器学习/深度学习 编解码 算法
CV面试题目总结(一)- 深度学习算法
CV面试题目总结(一)- 深度学习算法
523 0
|
Rust 监控 编译器
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
解密 Python 如何调用 Rust 编译生成的动态链接库(一)
436 2
|
算法 数据安全/隐私保护
织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE
本项目展示了织物瑕疵检测中的图像拼接技术,使用SIFT、SURF和KAZE三种算法。通过MATLAB2022a实现图像匹配、配准和拼接,最终检测并分类织物瑕疵。SIFT算法在不同尺度和旋转下保持不变性;SURF算法提高速度并保持鲁棒性;KAZE算法使用非线性扩散滤波器构建尺度空间,提供更先进的特征描述。展示视频无水印,代码含注释及操作步骤。