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

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

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

enter image description here

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

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

OpenCV模板匹配

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

OpenCV 特征匹配

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

神经网络分类

我还研究了神经网络 - 它们在图像分类方面表现出色,但它们也需要针对每个类别的训练集,而这部分是不可能的,因为我们有无限可能的图像集。

您会使用哪些方法和算法来完成此类任务?

最佳答案

方法一

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

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

enter image description here

enter image description here

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

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

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

编辑

方法二

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

如果你 checkout THIS DOCUMENTATION PAGE您会遇到使用的不同参数。

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

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

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

关于opencv - 计算图片与其草图的相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42292685/

相关文章:

c++ - How to?: 将cv::Mat定义为类成员,然后在源代码文件中修改它

iOS Accelerate Framework vImage - 性能改进?

python - Keras 性能不佳(损失和优化功能?)

python - SOM-- 神经网络

opencv - 在 OpenCV 上获取屏幕大小

visual-studio - 表达式 : "(_Ptr_user&(_BIG_ALLOCATION_ALIGNMENT - 1)) ==0" && 0

python - 为什么我无法使用随机森林找到最低平均绝对误差?

python-3.x - 在TensorFlow中,函数 'axis'中的参数 'tf.one_hot'是什么

python - ValueError : Shapes (16, ) 和 (1, 16) 在 tensorflow1.0 中不兼容

python - 使用 TensorFlow 从 Google Drive 下载时出现 HTTP 错误