首页 > 解决方案 > 使用图像相似性度量的图像搜索

问题描述

我正在开发一个图像搜索引擎项目。其背后的逻辑是数据库中存储了一些图像,用户将输入一个新图像,它将与存储在数据库中的图像进行匹配。结果将是查询图像与数据库中存储图像的最接近匹配列表。

图像是邮票。现在的问题是有新邮票和二手邮票。新只是一个邮票图像,而二手是有一部分被黑色取消标记遮住,所以它不能完美匹配。

以下是两者的几个示例(新的和二手的):

新邮票 二手邮票 新邮票 二手邮票

我使用了各种度量,例如 compare_mse、compare_ssim 和 compare_nrmse。但它们都倾向于不同。我也使用了https://github.com/EdjoLabs/image-match算法,但它也同样给出了低相似度分数。

你们认为我需要使用一些预处理或其他东西吗?我还从图像中删除了黑色边框,但结果有点好,但并不令人满意。我已经将它们转换成灰度并匹配,仍然没有令人满意的结果。任何有关如何获得高相似度分数的建议和建议将不胜感激!这是我的代码:

img1 = cv2.imread('C:\\Users\\Quin\\Desktop\\1frclean2.jpg', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('C:\\Users\\Quin\\Desktop\\1fr.jpg', cv2.IMREAD_GRAYSCALE)
compare_mse(cv2.resize(img1, (355, 500)), cv2.resize(img2, (355, 500)))
compare_ssim(cv2.resize(img1, (355, 500)), cv2.resize(img2, (355, 500)))

MSE 返回 4797.232123943662,SSIM 返回 0.2321816144043102。

标签: pythonopencvimage-processingcomputer-visionopencv-python

解决方案


MSE 和 SSIM 不适合这个问题,因为它们的目标是逐像素比较。例如,这是 NVIDIA 的一篇文章,展示了 SSIM 如何在即使是简单的情况下也显着失败。

在你的情况下,我会尝试两种方法:

  1. 使用嵌入进行反向搜索。

  2. 由于邮票通常包含文本,您可以使用一些视觉云服务对其进行识别/OCR,然后比较文本字符串的相似性。


推荐阅读