第十四篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像特征提取与描述

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

cv2.waitKey(0)
cv2.destroyAllWindows()


以上代码中,首先读取图像,并创建特征点检测器和特征描述子计算器。然后使用特征点检测器检测图像中的特征点,再利用特征描述子计算器计算特征描述子。最后,将特征点绘制在图像上并显示出来。


需要注意的是,不同的特征点检测器和特征描述子计算器具有不同的参数设置和使用方式,请根据实际需求进行调整。此外,为了使用OpenCV的特征提取和描述功能,需要安装OpenCV库并正确配置环境。


### 三、扩展思路介绍


![在这里插入图片描述](https://img-blog.csdnimg.cn/1d30fe2b82f0431e8eb79f88accf54e8.jpg)当涉及到图像特征提取和描述时,OpenCV提供许多其他功能和方法,可以进一步扩展应用。以下是一些扩展的方向:


1. 特征点筛选和匹配优化:在进行特征匹配之前,可以使用不同的筛选方法来排除错误匹配或不可靠的特征点。例如,使用RANSAC算法进行外点剔除,或者通过比较特征描述子之间的相似性进行匹配筛选。
2. 多尺度特征提取:OpenCV提供了多种多尺度特征提取方法,如金字塔SIFT和SURF。这些方法可以在不同尺度上提取特征点,并计算对应的特征描述子,从而增强对尺度变化的鲁棒性。
3. 非局部特征描述子:除了局部特征描述子(如SIFT、SURF、ORB)之外,OpenCV还支持一些非局部特征描述子,如Bag-of-Features(BoF)和Fisher Vectors。这些描述子可以更好地捕捉整体图像的特征信息,适用于图像分类和检索任务。
4. 基于深度学习的特征提取:随着深度学习的发展,基于卷积神经网络(CNN)的特征提取方法在图像处理中得到了广泛应用。OpenCV提供了与深度学习框架的集成,可以使用预训练的CNN模型来提取图像特征。例如,可以使用OpenCV的DNN模块加载和使用已经训练好的网络模型,如VGG、ResNet等。
5. 自定义特征提取:除了使用OpenCV提供的预定义特征点检测器和描述子计算器,您还可以根据自己的需求开发和实现自定义的特征提取算法。OpenCV提供了丰富的图像处理函数和工具,可以帮助您进行图像分析和特征提取的开发。


以上只是一些扩展方向的简要介绍,实际应用中还有更多技术和方法可供探索。通过灵活运用OpenCV的功能和工具,可以实现各种图像特征提取和描述的需求。


### 四、特征点筛选和匹配优化示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/4142bd077f1141f5ab34c714b3eeb0d6.png)特征点筛选和匹配优化是在进行特征匹配之前或之后,对特征点进行进一步处理以提高匹配准确性的步骤。以下是一个示例代码,展示了如何使用RANSAC算法进行特征匹配的外点剔除:



import cv2
import numpy as np

读取两张图像

image1 = cv2.imread(‘image1.jpg’)
image2 = cv2.imread(‘image2.jpg’)

创建特征点检测器和特征描述子计算器

detector = cv2.FeatureDetector_create(“ORB”)
descriptor = cv2.DescriptorExtractor_create(“ORB”)

检测特征点并计算描述子

keypoints1 = detector.detect(image1)
keypoints1, descriptors1 = descriptor.compute(image1, keypoints1)

keypoints2 = detector.detect(image2)
keypoints2, descriptors2 = descriptor.compute(image2, keypoints2)

创建匹配器

matcher = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)

特征点匹配

matches = matcher.match(descriptors1, descriptors2)

使用RANSAC算法进行外点剔除

src_points = np.float32([keypoints1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
dst_points = np.float32([keypoints2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)
mask = cv2.findHomography(src_points, dst_points, cv2.RANSAC, 5.0)[1]

保留内点

matches_filtered = [m for m, mask_value in zip(matches, mask) if mask_value]

绘制匹配结果

image_matches = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches_filtered, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow(‘Matches’, image_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()


以上代码中,首先读取两张图像,并创建特征点检测器和特征描述子计算器。然后使用这些工具检测特征点并计算对应的描述子。接下来,使用匹配器进行特征点匹配。最后,利用RANSAC算法进行外点剔除,保留内点,并绘制匹配结果。


需要注意的是,RANSAC算法是一种鲁棒性较高的外点剔除方法,通过计算单应性矩阵来判断特征点匹配的准确性。在代码中,我们使用`cv2.findHomography()`函数计算单应性矩阵,并根据阈值(5.0)来判断内点和外点。根据实际需求,您可以调整阈值来控制内点的数量。


### 五、多尺度特征提取示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/8586aad39349429ebeb51b0bc5c12ec6.jpg)多尺度特征提取是一种常用的方法,可以增强对尺度变化的鲁棒性。下面是一个示例代码,展示了如何使用金字塔SIFT进行多尺度特征提取:



import cv2

读取图像

image = cv2.imread(‘image.jpg’)

创建SIFT对象

sift = cv2.xfeatures2d.SIFT_create()

构建图像金字塔

pyramid = [image]
for i in range(3):
image = cv2.pyrDown(image)
pyramid.append(image)

在每个尺度上提取特征点和计算描述子

keypoints = []
descriptors = []
for level, img in enumerate(pyramid):
kp, desc = sift.detectAndCompute(img, None)
for k in kp:
k.pt = (k.pt[0] * (2 ** level), k.pt[1] * (2 ** level))
keypoints.extend(kp)
descriptors.append(desc)

绘制特征点

image_with_keypoints = cv2.drawKeypoints(pyramid[-1], keypoints, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow(‘Image with Keypoints’, image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()


以上代码中,首先读取图像,并创建SIFT对象。然后使用`cv2.pyrDown()`函数构建图像金字塔,降采样图像并存储在`pyramid`列表中。接下来,在每个尺度上使用SIFT对象的`detectAndCompute()`函数提取特征点和计算描述子,并将特征点的坐标乘以相应的尺度因子进行调整。最后,将特征点绘制在原始图像的最底层金字塔图像上,并显示出来。


需要注意的是,金字塔SIFT方法通过降采样图像来实现多尺度特征提取。在示例代码中,我们使用`cv2.pyrDown()`函数进行图像降采样,每次降低一倍分辨率。您可以根据需求调整金字塔层数和降采样因子。


### 六、非局部特征描述子示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/4dd39ddcb0dc4d00a27c5e3032d31a2d.jpeg)非局部特征描述子,如Bag-of-Features(BoF)和Fisher Vectors,可以更好地捕捉整体图像的特征信息。以下是一个示例代码,展示了如何使用OpenCV进行BoF特征提取:



import cv2
import numpy as np

读取图像

image1 = cv2.imread(‘image1.jpg’)
image2 = cv2.imread(‘image2.jpg’)

创建SIFT对象

sift = cv2.xfeatures2d.SIFT_create()

提取特征点和计算描述子

keypoints1, descriptors1 = sift.detectAndCompute(image1, None)
keypoints2, descriptors2 = sift.detectAndCompute(image2, None)

创建词袋模型

dictionary_size = 100 # 设置词典大小
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 0.01)
flags = cv2.KMEANS_RANDOM_CENTERS
_, labels, centers = cv2.kmeans(descriptors1, dictionary_size, None, criteria, 10, flags)

计算图像的BoF特征向量

histogram1 = np.zeros((1, dictionary_size), dtype=np.float32)
for label in labels:
histogram1[0, label] += 1

规范化特征向量

histogram1 /= np.sum(histogram1)

对第二张图像进行相同的操作,计算其BoF特征向量

_, labels, _ = cv2.kmeans(descriptors2, dictionary_size, None, criteria, 10, flags)
histogram2 = np.zeros((1, dictionary_size), dtype=np.float32)
for label in labels:
histogram2[0, label] += 1
histogram2 /= np.sum(histogram2)

计算两个图像的相似性(使用直方图相交)

similarity = cv2.compareHist(histogram1, histogram2, cv2.HISTCMP_INTERSECT)
print(‘Similarity:’, similarity)


以上代码中,首先读取两张图像,并创建SIFT对象。然后使用`detectAndCompute()`函数提取特征点和计算描述子。接下来,使用K均值聚类算法构建词袋模型,并将描述子分配到相应的词袋中心。然后,根据每个图像的词袋分配结果计算BoF特征向量,并进行规范化处理。最后,使用`compareHist()`函数计算两个图像的相似性,这里使用的是直方图相交作为相似性度量。


需要注意的是,以上代码只是一个简单示例,展示了如何使用BoF特征提取方法。在实际应用中,可能需要更复杂的流程和更大的词典大小来捕捉更丰富的特征信息。


### 七、基于深度学习的特征提取示例代码


![在这里插入图片描述](https://img-blog.csdnimg.cn/37e79a7bf7904a1e8975aa64a05a6a69.jpeg)基于深度学习的特征提取可以利用预训练的卷积神经网络(CNN)模型来提取图像特征。以下是一个示例代码,展示了如何使用OpenCV的DNN模块和预训练的VGG16模型进行特征提取:



import cv2
import numpy as np

读取图像

image = cv2.imread(‘image.jpg’)

加载预训练的VGG16模型

model_file = ‘vgg16.caffemodel’
config_file = ‘vgg16.prototxt’
net = cv2.dnn.readNetFromCaffe(config_file, model_file)

图像预处理

blob = cv2.dnn.blobFromImage(image, 1.0, (224, 224), (104.0, 177.0, 123.0), swapRB=True, crop=False)

设置输入并前向传播

net.setInput(blob)
features = net.forward()

提取特征向量

feature_vector = np.squeeze(features)

打印特征向量的形状

print(‘Feature vector shape:’, feature_vector.shape)


以上代码中,首先读取图像,并加载预训练的VGG16模型。然后使用`cv2.dnn.blobFromImage()`函数对图像进行预处理,将其转换为网络所需的输入格式。接下来,将预处理后的图像输入到网络中,并通过前向传播获取特征向量。最后,使用`np.squeeze()`函数将特征向量的维度从(1, N)调整为(N,)。


需要注意的是,示例代码中使用的VGG16模型是基于Caffe框架训练的。您需要下载相应的模型文件(.caffemodel)和配置文件(.prototxt),并将其与代码放置在同一目录下。您也可以根据需要选择其他预训练的深度学习模型,并相应地修改代码。




文末有福利领取哦~
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

👉**一、Python所有方向的学习路线**

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。![img](https://img-blog.csdnimg.cn/c67c0f87cf9343879a1278dfb067f802.png)

👉**二、Python必备开发工具**

![img](https://img-blog.csdnimg.cn/757ca3f717df4825b7d90a11cad93bc7.png)  
👉**三、Python视频合集**

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。  
![img](https://img-blog.csdnimg.cn/31066dd7f1d245159f21623d9efafa68.png)

👉 **四、实战案例**

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。**(文末领读者福利)**  
![img](https://img-blog.csdnimg.cn/e78afb3dcb8e4da3bae5b6ffb9c07ec7.png)

👉**五、Python练习题**

检查学习结果。  
![img](https://img-blog.csdnimg.cn/280da06969e54cf180f4904270636b8e.png)

👉**六、面试资料**

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。  
![img](https://img-blog.csdnimg.cn/a9d7c35e6919437a988883d84dcc5e58.png)

![img](https://img-blog.csdnimg.cn/5db8141418d544d3a8e9da4805b1a3f9.png)

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传




**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值