鉴于即将启程旅行,先上传篇简单的图像检索介绍,与各位一起学习opencv的同学共勉
图片的特征主要分为角点,斑点、边、脊向等,都是常用特征检测算法所检测到的图像特征·
<强> 1. harris角点检测强>
先将图片转换为灰度模式,再使用以下函数检测图片的角点特征:
dst=cv2。cornerHarris (src blockSize ksize k (dst [, borderType]])
重点关注第三个参数,这里使用了索贝尔算子,简单来说,其取为3-31间的奇数,定义了角点检测的敏感性,不同图片需要进行调试。
k是Harris角点检测方程中的自由参数,取值参数为[0,04,0.06]。
<强> 2.狗角点检测及筛选特征变换强>
Harris角点检测在面对图像尺度性发生改变时极其容易丢失图像细节,造成检测失误。因此在检测图像特征时,常常我们需要一些拥有尺度不变性的特征检测算法。
狗角点检测即将两幅图像在不同参数下的高斯滤波结果相减,得到狗图。步骤:用两个不同的5 x5高斯核对图像进行卷积,然后再相减的操作。重复三次得到三个差分图A, B, C .计算出的A, B, C三个狗图中求图B中是极值的点。图B的点在当前由A, B, C共27个点组成的块中是否为极大值或者极小值。若满足此条件则认为是角点。
筛选对象会使用狗检测关键点,并对每个关键点周围的区域计算特征向量。事实上他仅做检测和计算,其返回值是关键点信息(关键点)和描述符。
#下列代码即先创建一个筛选对象,然后计算灰度图像 筛?cv2.xfeatures2d.SIFT_create () 要点、描述符=sift.detectAndCompute(灰色,无) #筛对象会使用狗检测关键点,对关键点周围的区域计算向量特征,检测并计算
需要注意的是,返回的是关键点和描述符
关键点是点的列表
描述符是检测到的特征的局部区域图像列表
介绍一下关键点的属性:pt:点的x y坐标尺寸:表示特征的直径角:特征方向反应:关键点的强度八度:特征所在金字塔层级,算法进行迭代的时候,作为参数的图像尺寸和相邻像素会发生变化八度属性表示检测到关键点所在的层级ID:检测到关键点的ID
筛选特征不只具有尺度不变性,即使改变旋转角度,图像亮度或拍摄视角,仍然能够得到好的检测效果。
<强> 3.冲浪提取和检测特征强>
冲浪是筛选的加速版算法,采用快速黑森算法检测关键点
借用下度娘的说法:冲浪算法原理:
1。构建黑森矩阵构造高斯金字塔尺度空间
2。利用非极大值抑制初步确定特征点
3精确定位极值点
4选取特征点的主方向
5构造冲浪特征点描述算子
具体应用看代码
进口cv2 进口numpy np img=cv2.imread (“/home/yc/图片/jianbin.jpg”) #参数为黑森矩阵的阈值 冲浪=cv2.xfeatures2d.SURF_create (4000) #设置是否要检测方向 surf.setUpright(真正的) #输出设置值 print (surf.getUpright ()) #找到关键点和描述符 key_query desc_query=surf.detectAndCompute (img,没有) img=cv2.drawKeypoints (img, key_query img) #输出描述符的个数 print (surf.descriptorSize ()) cv2.WINDOW_NORMAL cv2.namedWindow(“建斌”) cv2.imshow(建斌,img) cv2.waitKey (0) cv2.destroyAllWindows ()
这是检测效果,图中已标志出特征点,不要问我为什么选这种鬼畜样图,可能是因为情怀(滑稽)
样图
需要注意的是,需要安装之前版本的opencv-contrib库才可以使用,冲浪及筛选均受专利保护
<强> 4. orb特征提取强>
ORB算法使用快算法寻找关键点,然后使用Harris角点检测找到这些点当中的最好的N个点,采用简要描述子的特性.ORB算法处于起步阶段,速度优于前两种算法,也吸收了其优点,同时他是开源的。
#创建ORB特征检测器和描述符 orb=cv2.ORB_create () kp=orb.detect (img,没有) #对图像检测特征和描述符 kp, des=orb.compute (img, kp) #注意kp是一个包含若干点的列表,des对应每个点的描述符是一个列的表,每一项都是检测祝辞到的特征的局部图像详解opencv Python特征检测及K -最近邻匹配