计算图片与其草图的相似度

时间:2017-02-17 08:14:14

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

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

enter image description here

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

我尝试了很少的方法,但它们都没有成功:

OpenCV模板匹配

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

OpenCV功能匹配

我用这种方法失败了,因为我找不到用于从人类草图中提取重要特征的好算法。来自OpenCV's tutorials的算法可以很好地提取角点和blob作为特征。但是在这里,在草图中,我们有很多笔画 - 每个笔画都会产生很多微不足道的垃圾特征并导致模糊的结果。

神经网络分类

我还看了一下神经网络 - 他们擅长图像分类,但他们也需要每个班级的训练集,这部分是不可能的,因为我们有一组无限的可能图像。

您将使用哪种方法和算法进行此类任务?

1 个答案:

答案 0 :(得分:3)

<方法1

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

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

enter image description here

enter image description here

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

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