python opencv 图片相似度
时间: 2023-06-05 13:47:20 浏览: 287
Python OpenCV可以用于计算两张图片之间的相似度。常用的方法是使用结构相似性指数(SSIM)或均方误差(MSE)来计算相似度。SSIM是一种比较复杂的算法,它考虑了图像的亮度、对比度和结构等因素,因此可以更准确地评估两张图片之间的相似度。而MSE则是一种简单的算法,它只考虑了像素值之间的差异,因此可能会出现误差较大的情况。在实际应用中,可以根据具体情况选择合适的算法来计算图片相似度。
相关问题
python opencv 判断图片相似度
### 使用Python和OpenCV实现图像相似性检测
#### 导入必要的库
为了使用Python和OpenCV进行图像相似性检测,首先需要导入所需的库。这通常包括`cv2`用于图像处理操作以及`numpy`来辅助数值运算。
```python
import cv2
import numpy as np
from skimage.metrics import structural_similarity as ssim
```
#### 加载待比较的两幅图像
接下来要加载想要比较的两个文件中的图像,并将其转换成灰度模式以便后续处理。
```python
imageA = cv2.imread('path_to_first_image')
imageB = cv2.imread('path_to_second_image')
# 将彩色图像转为灰度图
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
grayB = cv2.cvtColor(imageB, cv2.COLOR_BGR2GRAY)
```
#### 计算结构相似性指数 (SSIM)
结构相似性指数测量了两幅测试样本之间的相似程度,在这里用来评估两张图片间的匹配度。它不仅考虑亮度、对比度还加入了结构性信息的影响因素。
```python
(score, diff) = ssim(grayA, grayB, full=True)
print(f'SSIM Score: {score}')
diff = (diff * 255).astype("uint8")
```
此分数越接近于1表示两者越相像;而当值趋近于0时,则意味着存在较大差别[^3]。
#### 基于ORB特征点描述符法
另一种常用方法是利用局部不变量特性来进行匹配分析。下面展示的是采用ORB算法提取关键点并建立描述子向量的过程:
```python
orb = cv2.ORB_create()
kpA, desA = orb.detectAndCompute(grayA, None)
kpB, desB = orb.detectAndCompute(grayB, None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(desA, desB)
good_matches = sorted(matches, key=lambda x:x.distance)[:10]
img_matches = cv2.drawMatches(
img1=grayA,
keypoints1=kpA,
img2=grayB,
keypoints2=kpB,
matches1to2=good_matches,
outImg=None,
flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS
)
cv2.imshow('Matches', img_matches)
cv2.waitKey(0); cv2.destroyAllWindows();
```
上述代码片段展示了如何通过ORB找到最佳匹配的关键点对,并绘制出来供观察者直观理解两者的关联情况[^1]。
opencv 图片相似度
### 使用 OpenCV 计算图片相似度
#### 基于哈希值的方法
感知哈希算法是一种用于图像相似度计算的技术,它能够为每张图像生成一个独特的“指纹”字符串。通过对比这些指纹字符串的结果可以判断两张图像是多么相像。当两个图像的哈希值越相近,则表示这两者之间具有更高的相似程度[^2]。
对于具体的实现过程,在OpenCV环境下可以通过转换灰度空间、缩小尺寸至固定大小(如8×8)、计算平均像素强度以及构建二进制串作为最终hash码等方式完成pHash操作;而dHash则是基于相邻列间差异累计形成bit序列。最后利用汉明距离衡量两幅作品间的异同之处。
#### 特征描述子法
另一种常用的方式是提取并比较图像的关键点及其对应的局部外观特征——即所谓的SIFT/SURF/ORB等不变性特征描述符。以ORB为例,先检测角点位置再描绘周围区域特性构成高维度向量形式表达整张照片信息。接着借助FLANN匹配器寻找最佳对应关系,并统计满足一定阈值条件下的配对数目比例反映整体形似状况。此方法适用于存在旋转缩放变化情况下的对象检索场景下[^3]。
```python
import cv2
import numpy as np
def compute_similarity(imageA, imageB):
orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(imageA,None)
kp2, des2 = orb.detectAndCompute(imageB,None)
bf = cv2.BFMatcher(cv2.NORM_HAMMING,crossCheck=True)
matches = bf.match(des1,des2)
good_matches = sorted(matches,key=lambda x:x.distance)[:10]
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 2)
M, mask = cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,ransacReprojThreshold=5.0)
matchesMask = mask.ravel().tolist()
h,w = imageA.shape[:2]
pts = np.float32([[0, 0], [0,h-1],[w-1,h-1],[w-1,0]]).reshape(-1,1,2)
dst = cv2.perspectiveTransform(pts,M)
similarity_score=len(good_matches)/len(kp1)+len(good_matches)/len(kp2)
return similarity_score*100
img1 = cv2.imread('image1.jpg',cv2.IMREAD_GRAYSCALE )
img2 = cv2.imread('image2.jpg',cv2.IMREAD_GRAYSCALE )
print(f"The similarity between two images is {compute_similarity(img1,img2)}%")
```
上述代码展示了如何使用ORB算法来评估两张给定黑白影像之间的近似水平百分比得分。这里选取了前十个最优解来进行变换矩阵估计从而获得更稳健可靠的测量指标。
阅读全文
相关推荐













