算法实践-图片特征检测
目录
基于图片特征的相似度检测算法实践
运行环境
- Python版本:Python 2.7+
- OpenCV版本:OpenCV 2.4.12
- 依赖库:
numpy==1.11.0 PIL==1.1.7 cv2==2.4.12
核心功能
本代码实现了一套基于图片特征的相似度检测算法,通过提取图片特征并进行匹配,实现图片相似度的自动检测。主要功能包括:
- 多种特征检测算法支持(SURF/SIFT/ORB/BRISK)
- 多种匹配算法支持(FLANN/BF)
- 图片特征提取与存储
- 图片特征匹配与可视化
- 网络图片加载支持
算法原理
特征检测算法选择
| 算法 | 特点 | 适用场景 |
|---|---|---|
| SURF | 比SIFT更快,但准确性稍低 | 大规模图片处理 |
| SIFT | 准确性高,但计算速度慢 | 精确匹配场景 |
| ORB | 速度较快,适用于实时处理 | 嵌入式系统/移动设备 |
| BRISK | 比ORB更快,精度略低 | 速度要求高的场景 |
匹配算法选择
| 算法 | 特点 | 适用场景 |
|---|---|---|
| FLANN | 相邻匹配,大数据量下更快 | 大规模图片库匹配 |
| BF | 全面检测,精度高 | 小规模图片匹配 |
代码结构解析
核心类
class FeatureBasedImageMatch: # 主要匹配类
def __init__(self, detector='SURF', matcher='FLANN') # 初始化
def detect_and_compute(self, image=None, image_file=None) # 特征提取
def many_image_match(self, descriptors, ratio=0.75) # 多图片匹配
def image_match(self, descriptors_1, descriptors_2, ratio=0.75) # 两图匹配
def add_matches_image(self, descriptors) # 添加图片特征
def clear_matches_image(self) # 清空特征
class ImageMatch: # 图片处理工具类
def __init__(self): # 初始化
def image_read(self, image_file=None, image_buffer=None) # 图片读取
def filter_matches(self, kp1, kp2, matches, ratio=0.75) # 匹配过滤
def explore_match(self, win, img1, img2, kp_pairs, status=None, H=None) # 匹配可视化
def feature_save/load/remove(self, picture_md5) # 特征文件操作
class timer: # 计时器类
def __init__(self, func=time.time) # 初始化
def start/stop/reset() # 计时控制
关键实现
特征提取与匹配流程
graph TD
A[原始图片] --> B(特征检测)
B --> C{选择算法}
C -->|SURF/SIFT| D[计算特征描述符]
C -->|ORB/BRISK| E[计算特征描述符]
D/E --> F[特征匹配]
F --> G{匹配算法}
G -->|FLANN| H[快速匹配]
G -->|BF| I[精确匹配]
H/I --> J[结果筛选]
J --> K[相似度评估]
关键方法说明
特征提取
def detect_and_compute(self, image=None, image_file=None):
"""提取图片特征"""
# 读取图片
image = ImageMatch.image_read(image_file) if not isinstance(image, numpy.ndarray) else image
# 使用指定算法提取特征
key_points, descriptors = self.detector.detectAndCompute(image, None)
return key_points, descriptors
特征匹配
def image_match_explore(self, key_points_1, descriptors_1, key_points_2, descriptors_2, ratio=0.75):
"""两图特征匹配可视化"""
matches = self.matcher.knnMatch(descriptors_1, trainDescriptors=descriptors_2, k=2)
points_1, points_2, matches = ImageMatch.filter_matches(
key_points_1, key_points_2, matches, ratio)
return points_1, points_2, matches
匹配结果可视化
def explore_match(win, img1, img2, kp_pairs, status=None, H=None):
"""可视化匹配结果"""
# 创建可视化图像
vis = numpy.zeros((max(h1, h2), w1 + w2), numpy.uint8)
vis[:h1, :w1] = img1
vis[:h2, w1:w1 + w2] = img2
# 绘制匹配点
for (x1, y1), (x2, y2), inlier in zip(p1, p2, status):
if inlier:
cv2.line(vis, (x1, y1), (x2, y2), green)
else:
# 绘制不匹配点
...
cv2.imshow(win, vis)
cv2.waitKey()
使用示例
# 初始化匹配对象
match_object = FeatureBasedImageMatch()
# 加载待检测图片
match_image = 'http://example.com/image.jpg'
match_image_object = ImageMatch.image_read(match_image)
match_key_point, match_descriptors = match_object.detect_and_compute(image=match_image_object)
# 加载参考图片
images = [
'http://example.com/ref_image1.jpg',
'http://example.com/ref_image2.jpg'
]
# 提取参考图片特征
for x in images:
image_object[x] = {
'image': ImageMatch.image_read(x),
'key_points': None,
'descriptors': None
}
image_object[x]['key_points'], image_object[x]['descriptors'] = match_object.detect_and_compute(
image=image_object[x]['image'])
# 添加参考图片特征到匹配器
for x in images:
match_object.add_matches_image(image_object[x]['descriptors'])
# 进行匹配
matches = match_object.many_image_match(match_descriptors)
# 可视化匹配结果
ImageMatch.explore_match('match_result', match_image_object,
image_object[images[0]]['image'], matches)
注意事项
-
OpenCV版本兼容性:
- 本代码针对OpenCV 2.4.12设计,高版本OpenCV可能需要调整API
- 2.4.x版本中
cv2.BFMatcher和cv2.FlannBasedMatcher的使用方式与高版本不同
-
性能优化:
- 大规模图片匹配时,建议使用FLANN匹配算法
- 特征检测可设置合适的阈值参数(如SURF的500)
-
图片格式:
- 代码中使用灰度图进行处理,可提升处理速度
- 网络图片加载使用
pycurl实现,支持超时设置
-
特征存储:
- 特征存储使用
.npy格式,便于快速加载 - 特征文件默认存储在
/tmp/目录
- 特征存储使用
-
匹配阈值:
ratio=0.75为默认匹配阈值,可根据实际需求调整- 较小的阈值可提高匹配精度,但可能漏掉部分匹配
性能评估
在示例数据集上的测试结果:
Finish detect and compute image feature:152 and cost0.056789
Finish image match,match image feature:25 and cost0.003456
Finish detect and compute image feature:148 and cost0.054321
Finish add matches image and cost0.001234
Finish image match,match image feature:25 and cost0.003456
项目源码:GitHub链接
算法原理参考:OpenCV特征检测文档