【问题标题】:Calculate similarity of picture and its sketch计算图片及其草图的相似度
【发布时间】:2017-07-06 16:05:01
【问题描述】:

我正在尝试开发算法,该算法返回两张给定黑白图像的相似度分数:原始一张及其草图,由人类绘制:

所有原始图像都具有相同的样式,但没有任何给定的有限集合。它们的内容可能完全不同。

我尝试了几种方法,但都没有成功:

OpenCV 模板匹配

OpenCV matchTemplate 无法计算图像的相似度分数。它只能告诉我匹配像素的数量,而且这个值通常很低,因为人体素描的比例不理想。

OpenCV 特征匹配

我用这种方法失败了,因为我找不到从人类草图中提取重要特征的好的算法。来自OpenCV's tutorials 的算法擅长将角点和斑点提取为特征。但是在这里,在草图中,我们有很多笔画——每一个都会产生很多无关紧要的垃圾特征,并导致模糊的结果。

神经网络分类

我还研究了神经网络——它们擅长图像分类,但它们也需要每个类别的训练集,而这部分是不可能的,因为我们有无限的可能图像集。

对于此类任务,您会使用哪些方法和算法?

【问题讨论】:

  • 看看倒角匹配。您需要找到使其缩放和旋转不变的方法。其他形状匹配算法也可能不错。看看活跃的轮廓!
  • 互相关如何?你可以得到最佳匹配像素位置,然后你可以对齐图像并计算相似度分数
  • 考虑到它们是二进制图像,'余弦 - 相似度'怎么样?

标签: opencv machine-learning neural-network computer-vision similarity


【解决方案1】:

方法 1

余弦相似度给出的相似度分数介于 (0 - 1) 之间。

我首先将图像转换为灰度并将它们二值化。我将原始图像裁剪为一半大小并排除了文本,如下所示:

然后我使用flatten() 将图像数组转换为一维数组。我使用以下方法来计算 余弦相似度

from scipy import spatial
result = spatial.distance.cosine(im2, im1)
print result

我得到的结果是0.999999988431,这意味着图像彼此相似。

编辑

方法 2

我有时间查看另一个解决方案。我发现 OpenCV 的 cv2.matchTemplate() 函数执行相同的工作。

如果您查看THIS DOCUMENTATION PAGE,您会发现使用的不同参数。

我使用了cv2.TM_SQDIFF_NORMED 参数(它给出了两个图像之间的归一化平方差)。

    res = cv2.matchTemplate(th1, th2, cv2.TM_SQDIFF_NORMED)
    print 1 - res

对于给定的图像,我获得了相似度分数:0.89689457

【讨论】:

  • 同时检查THIS POST
  • 请问先生您是如何将图像转换为一维数组的?
  • @0x01Brain np.flatten() from here
  • 我试过了,但做的时候什么也没返回:spatial.distance.cosine(im2, im1)
  • 我的意思是它总是返回 0.0 为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多