下面是Python基于OpenCV识别两张相似图片的完整攻略:
首先,我们需要安装OpenCV库和Python中的图片处理库Pillow(PIL):
pip install opencv-python Pillow
我们可以使用OpenCV读取图片数据:
import cv2
img1 = cv2.imread('image1.jpg') # 读取图片1
img2 = cv2.imread('image2.jpg') # 读取图片2
我们可以使用OpenCV中的ORB算法提取图片特征:
orb = cv2.ORB_create() # 创建ORB特征提取器
kp1, des1 = orb.detectAndCompute(img1, None) # 提取图片1特征
kp2, des2 = orb.detectAndCompute(img2, None) # 提取图片2特征
我们可以使用OpenCV中的BFMatcher暴力匹配算法匹配图片特征:
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 创建暴力匹配器
matches = bf.match(des1, des2) # 匹配图片特征
matches = sorted(matches, key=lambda x: x.distance) # 按距离从小到大排序
我们定义一个阈值,如果最好的匹配的距离小于这个阈值,就认为两张图片相似:
THRESHOLD = 50 # 设定阈值
if matches[0].distance < THRESHOLD:
print('两张图片相似')
else:
print('两张图片不相似')
我们先来测试图片1和2是完全相同的:
import cv2
img1 = cv2.imread('image1.jpg') # 读取图片1
img2 = cv2.imread('image1.jpg') # 读取图片2
orb = cv2.ORB_create() # 创建ORB特征提取器
kp1, des1 = orb.detectAndCompute(img1, None) # 提取图片1特征
kp2, des2 = orb.detectAndCompute(img2, None) # 提取图片2特征
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 创建暴力匹配器
matches = bf.match(des1, des2) # 匹配图片特征
matches = sorted(matches, key=lambda x: x.distance) # 按距离从小到大排序
THRESHOLD = 50 # 设定阈值
if matches[0].distance < THRESHOLD:
print('两张图片相似')
else:
print('两张图片不相似')
运行后输出结果为:两张图片相似
我们再来测试两张稍微不同的图片:
import cv2
img1 = cv2.imread('image3.jpg') # 读取图片1
img2 = cv2.imread('image4.jpg') # 读取图片2
orb = cv2.ORB_create() # 创建ORB特征提取器
kp1, des1 = orb.detectAndCompute(img1, None) # 提取图片1特征
kp2, des2 = orb.detectAndCompute(img2, None) # 提取图片2特征
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 创建暴力匹配器
matches = bf.match(des1, des2) # 匹配图片特征
matches = sorted(matches, key=lambda x: x.distance) # 按距离从小到大排序
THRESHOLD = 50 # 设定阈值
if matches[0].distance < THRESHOLD:
print('两张图片相似')
else:
print('两张图片不相似')
运行后输出结果为:两张图片不相似
可以看到,使用ORB算法和BFMatcher算法对两张图片进行特征提取和匹配可以很好地实现两张相似图片的识别,这在实际中也非常有用。
本文链接:http://task.lmcjl.com/news/15162.html