传统图像处理之几何特征寻找算法(二)

简介: 传统图像处理之几何特征寻找算法(二)

Fast算法


Flast角点的定义是如果像素与其领域内足够多的像素不同,那么该像素可能为角点。显然Fast角点要求比Harris角点要低。Fast角点检测的优点就是速度快。其实就是确定一个点,对周围的16个点进行比对,如果其中n(一般为12)个连续的点像素都与该点不同,则为角点。很好理解,直接上代码。


27bfd23a6058426a57558627df320924_0a85ae9e94454c5fb8982762d61d77b4.gif


函数是cv2.FastFeatureDetector_create()函数,此函数可选参数为threshold(角点检测阈值)、nonmaxSuppression(是否使用非极大值抑制) ,type(检测类型),有cv2.FAST_FEATURE_DETECTOR_TYPE_5_8、cv2.FAST_FEATURE_DETECTOR_TYPE_7_12,


cv2.FAST_FEATURE_DETECTOR_TYPE_9_16.


import cv2
import numpy as np
#读取图片
img=cv2.imread('F:\Image\\test7.jpg')
#设置窗口
cv2.namedWindow('win',cv2.WINDOW_AUTOSIZE)
#fast角点检测
fast=cv2.FastFeatureDetector_create()
#检测到的角点保存为points
points=fast.detect(img)
#绘制特征图
img=cv2.drawKeypoints(img,points,img,color=(255,0,0))
#显示结果
cv2.imshow('fast角点检测',img)
cv2.waitKey(0)


37026e37fe7e7e4ebbf6d95156991cbd_0c2ef666c651439baad75821273a816b.png


结果是夸张了点,不过是可以选择参数来进行控制,下面一幅图就是我选择fast=cv2.FastFeatureDetector_create(type=cv2.FastFeatureDetector_TYPE_5_8)进行识别的,结果就好很多。


e63d600324694411921bed44a91988d3_d27f751b1bde4d358a7bbe837f63d7e5.png


斑点


斑点和我们传统意义上的斑点的理解很相似,即存在边界包围的部分。斑点同样对噪声很敏感,需要先进行高斯滤波。同样需要寻找一阶导数的极值点(或者说二阶导数的零点),这里用到拉普拉斯梯度:


a43ffeba16b007f38d065799b7f1f97.png


同样,高斯函数的标准差对斑点检测有影响,较小的标准差可以识别出更加详细的边缘细节。


在OpenCV中,函数cv2.SimpleBlobDetector_create(),此函数的可选参数为minThreshold(检测最小阈值)、maxThreshold(检测最大阈值)、filterByColor(是否通过颜色滤波 )、filterByArea(是否通过面积滤波)、filterByCirculity(是否通过圆度滤波)、filterByConvexity(是否通过凸度滤波)、filterByInertia(是否通过惯性滤波)等。


import cv2
import numpy as np
#读取图片
img=cv2.imread('F:\Image\\test5.jpeg')
#创建检测器
detector=cv2.SimpleBlobDetector_create()
#斑点检测,将检测到的斑点放入bolbs中
blobs=detector.detect(img)
#绘制特征图
img=cv2.drawKeypoints(img,blobs,img,color=(0,0,255),flags=cv2.DrawMatchesFlags_DRAW_RICH_KEYPOINTS)
cv2.imshow('斑点检测',img)
cv2.waitKey(0)



图片中红色圆圈标注的就是识别到的斑点,检测效果也是比较好的。


局部特征


局部特征也叫特征描述子,其需要满足:对于大小,方向,明暗不同的图像,同一物体的特征描述子应该相似或相同。其特点就是可重复性和显著性。局部特征点常用于图片拼接,目标跟踪和3D重建。所有据局部特征算法都需要注意的问题是旋转不变、仿射不变、光照不变和抵抗噪声。


SIFT算法


尺度不变特征算法(SIFT)由Lowe在2004年提出,同样利用高斯卷积来建立尺度空间,并在高斯差分布空间金字塔上获得拥有尺度不变性的特征描述子。该算法具有仿射不变性、视角不变性、旋转不变性和光照不变性,所以在图像特征提取领域得到了最广泛的应用。优点是信息量丰富和多量性,缺点是速度和还不够快。


①.构建一个线性金字塔结构,让我们可以在连续的高斯核尺度上查找特征点。它比直接用拉普拉斯核的优势在于,他用一阶高斯差分(Dog算子)来近似拉普拉斯算子(Log算子),也就是用差分代替微分,大大减少了运算量。


②.其次,进行极值点的插值。


③.删除边缘效应的点,高斯差分的值会受到边缘的影响,所以边缘上的点,即使不是斑点,tadeDog响应也很强。


④.最后,作出特征描述子的特征描述。


在OpenCV中使用SIFT算法,cv2.xfeatures2d.SIFT_create()即可。


import cv2
import numpy as np
#读取图片
img=cv2.imread('F:\Image\\test5.jpeg')
#创建检测器
sift=cv2.SIFT_create()
points=sift.detect(img,None)
#绘制特征图
img=cv2.drawKeypoints(img,points,img,color=(255,0,255))
cv2.imshow('sift检测',img)
cv2.waitKey(0)



SURF算法


2006年,Bay和Ess改进了SIFT算法,提出了加速鲁棒特征(SURF),该算法主要优化计算速度,其使用了Hessian行列式的特征检测方法,通过在不同的尺度下的特征图上有效的计算出近似Harrr小波值,简化了二阶微分的计算,从而提高了特征检测算法的效率。


与SIFT算法统计直方图不同,SURF特征点的描述则是利用了积分图,用两个方向上的Harr小波来计算梯度,然后用一个扇形对领域点内的梯度方向进行统计。


函数使用:cv2.SURF_create().


上代码:


import cv2
import numpy as np
#读取图片
img=cv2.imread('F:\Image\\test5.jpeg')
#创建检测器
sift=cv2.SURF_create()
points=sift.detect(img,None)
#绘制特征图
img=cv2.drawKeypoints(img,points,img,color=(255,0,255))
cv2.imshow('sift检测',img)
cv2.waitKey(0)
但是这个代码的环境必须是低版本的opencv,否则没法使用。


项目实战——图像匹配


学习了新的算法,必须去项目上实战一下:


我们需要使用cv2.FlannBaseMatcher()函数,由于博主使用的OpenCV版本比较高,是用不了SURF算法,所以,博主这里就使用SIFT算法,如果你们有低版本的opencv,那就用SURF算法,SURF算法的运算速度是SIFT的3倍,综合性能也比较好。


#基于快速邻近搜索报的SIFT特征描述子匹配算法
import numpy as np
import cv2
#读取图片
img=img=cv2.imread('F:\Image\\test6.jpeg')
#仿射变换矩阵
M=np.array([[0,0.5,-10],[0.5,0,0]])
#旋转缩放图片
img1=cv2.warpAffine(img,M,(750,750))
#改变图片色调,对比度
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#改变色调
hsv[:,:,0]=(hsv[:,:,0]+10)%180
#改变饱和度
hsv[:,:,1]=(hsv[:,:,1]+10)%255
#改变明暗度
hsv[:,:,2]=(hsv[:,:,2]+10)%255
#转换为BGR格式
img1=cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
#创建检测器
surf=cv2.SURF_create()
#创建搜索器
index_params=dict(algorithm=0,trees=5)
search_params=dict(checks=50)
flann=cv2.FlannBasedMatcher(index_params,search_params)
#特征描述子检测
kp,des=surf.detect(img,None)
kp1,des1=surf.detect(img1,None)
#特征匹配
matches=flann.knnMatch(des1,des,k=2)
#绘制相似特征
good=[]
for m,n in matches:
    if m.distance<0.7*n.distance:
        good.append([m])
img2=cv2.drawMatchesKnn(img1,kp1,img,kp,good,None,flags=2)
#显示图片
cv2.imshow('图片调整',img1)
cv2.waitKey(0)


博主的opencv版本有问题,运行不了该程序,所以就不展示结果图了。理解含义就可以了。好了,本节内容就到此结束了。拜了个拜了!

相关文章
|
10天前
|
机器学习/深度学习 算法
基于心电信号时空特征的QRS波检测算法matlab仿真
本课题旨在通过提取ECG信号的时空特征并应用QRS波检测算法识别心电信号中的峰值。使用MATLAB 2022a版本实现系统仿真,涵盖信号预处理、特征提取、特征选择、阈值设定及QRS波检测等关键步骤,以提高心脏疾病诊断准确性。预处理阶段采用滤波技术去除噪声,检测算法则结合了一阶导数和二阶导数计算确定QRS波峰值。
|
1月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
118 1
|
1月前
|
机器学习/深度学习 算法 搜索推荐
支付宝商业化广告算法问题之在DNN模型中,特征的重要性如何评估
支付宝商业化广告算法问题之在DNN模型中,特征的重要性如何评估
|
3月前
|
机器学习/深度学习 存储 人工智能
算法金 | 使用随机森林获取特征重要性
**随机森林算法简介**:集成多个决策树提升性能,常用于各类任务。在葡萄酒分类项目中,使用`RandomForestClassifier`实现模型,100棵树,得分100%。特征重要性显示了哪些化学成分影响最大。通过特征选择保持高准确性,证明了有效特征选择的重要性。7个关键特征中脯氨酸和酒精含量最重要。简洁高效,适用于特征工程。[链接指向知识星球]
54 5
|
3月前
|
人工智能 搜索推荐 算法
常见的经典排序算法及其特征
【6月更文挑战第21天】本文介绍经典排序算法的特征和例子,详细步骤和例子包含在内,可以只选择阅读关心的内容。
41 3
|
3月前
|
机器学习/深度学习 算法 Python
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
机器学习算法的比较与选择是在实际应用中非常重要的一步,不同的算法适用于不同的问题和数据特征。
|
3月前
|
移动开发 算法 计算机视觉
技术笔记:openCV特征点识别与findHomography算法过滤
技术笔记:openCV特征点识别与findHomography算法过滤
68 0
|
22天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
22天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
23天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。