在Python中实现钥匙锯齿形状的相似度检测,可通过以下步骤结合图像处理和特征匹配技术实现:
1. 图像预处理使用OpenCV提取钥匙轮廓,将锯齿形状转换为二值化图像:
import cv2
import numpy as np
def preprocess_image(image_path):
# 读取图像并灰度化
img = cv2.imread(image_path, 0)
# 高斯模糊降噪
blurred = cv2.GaussianBlur(img, (5, 5), 0)
# 自适应阈值二值化
_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
# 寻找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 提取最大轮廓(假设钥匙是图像主体)
max_contour = max(contours, key=cv2.contourArea)
return max_contour 2. 特征向量化将轮廓的锯齿形状转换为特征向量(如坐标序列):
def contour_to_features(contour):
# 提取轮廓点坐标
points = np.squeeze(contour)
# 归一化坐标(消除位置和尺度差异)
points = (points - np.min(points, axis=0)) / (np.max(points, axis=0) - np.min(points, axis=0))
return points.flatten() # 展平为一维向量 3. 相似度计算使用余弦相似度或动态时间规整(DTW)比较特征向量:
方法一:余弦相似度from sklearn.metrics.pairwise import cosine_similarity
def cosine_similarity_compare(vec1, vec2):
return cosine_similarity([vec1], [vec2])[0][0] 方法二:动态时间规整(DTW)适用于锯齿序列长度不一致的情况:
from dtaidistance import dtw
def dtw_distance(seq1, seq2):
return dtw.distance(seq1, seq2) 4. 综合应用示例 # 加载并处理两把钥匙的图像
contour1 = preprocess_image("key1.jpg")
contour2 = preprocess_image("key2.jpg")
# 转换为特征向量
vec1 = contour_to_features(contour1)
vec2 = contour_to_features(contour2)
# 计算相似度
similarity = cosine_similarity_compare(vec1, vec2)
print(f"余弦相似度: {similarity:.2f}")
# 若锯齿序列长度不同,使用DTW
distance = dtw_distance(contour1.flatten(), contour2.flatten())
print(f"DTW距离: {distance:.2f}") 关键点图像预处理:通过二值化和轮廓提取分离锯齿形状。特征表示:将轮廓点归一化为固定长度的向量,消除位置和尺度影响。相似度算法:余弦相似度:适合向量维度一致的场景。DTW:适合处理锯齿序列长度不一致或局部形变的情况。通过上述方法,可有效检测钥匙锯齿形状的相似性,适用于安防系统或工业检测等场景。
网友回复


