计算图片与其草图的相似度
Calculate similarity of picture and its sketch
我正在尝试开发算法,returns 两张给定的黑白图像的相似度得分:原始图像及其草图,由人类绘制:
所有原图风格相同,但没有任何给定的有限集合。他们的内容可能完全不同。
我尝试了几种方法,但 none 还成功了:
OpenCV 模板匹配
OpenCV matchTemplate 无法计算图像的相似度 分数。它只能告诉我匹配像素的数量,而且这个值通常很低,因为人的草图比例不理想。
OpenCV 特征匹配
我用这个方法失败了,因为我找不到好的算法来从人体素描中提取 重要 特征。来自 OpenCV's tutorials 的算法擅长提取角点和斑点作为特征。但是在这里,在草图中,我们有很多笔画——每个笔画都会产生很多无关紧要的垃圾特征,并导致模糊的结果。
神经网络分类
我还看了一下神经网络——它们在图像分类方面做得很好,但它们也需要每个 类 的训练集,这部分是不可能的,因为我们有无限的可能集图片。
您会使用哪些方法和算法来完成此类任务?
方法一
余弦相似度 给出的相似度得分介于 (0 - 1) 之间。
我首先将图像转换为灰度并对其进行二值化。我将原始图像裁剪为一半大小并排除了文本,如下所示:
然后我使用 flatten()
将图像数组转换为一维数组。我使用以下方法计算 余弦相似度 :
from scipy import spatial
result = spatial.distance.cosine(im2, im1)
print result
我得到的结果是0.999999988431,这意味着图像在这个分数上彼此相似。
编辑
方法二
我有时间查看另一个解决方案。我发现 OpenCV 的 cv2.matchTemplate()
函数执行相同的工作。
如果您查看 THIS DOCUMENTATION PAGE,您会发现所使用的不同参数。
我使用了 cv2.TM_SQDIFF_NORMED
参数(它给出了两个图像之间的归一化平方差)。
res = cv2.matchTemplate(th1, th2, cv2.TM_SQDIFF_NORMED)
print 1 - res
对于给定的图像,我获得的相似度得分为:0.89689457
我正在尝试开发算法,returns 两张给定的黑白图像的相似度得分:原始图像及其草图,由人类绘制:
所有原图风格相同,但没有任何给定的有限集合。他们的内容可能完全不同。
我尝试了几种方法,但 none 还成功了:
OpenCV 模板匹配
OpenCV matchTemplate 无法计算图像的相似度 分数。它只能告诉我匹配像素的数量,而且这个值通常很低,因为人的草图比例不理想。
OpenCV 特征匹配
我用这个方法失败了,因为我找不到好的算法来从人体素描中提取 重要 特征。来自 OpenCV's tutorials 的算法擅长提取角点和斑点作为特征。但是在这里,在草图中,我们有很多笔画——每个笔画都会产生很多无关紧要的垃圾特征,并导致模糊的结果。
神经网络分类
我还看了一下神经网络——它们在图像分类方面做得很好,但它们也需要每个 类 的训练集,这部分是不可能的,因为我们有无限的可能集图片。
您会使用哪些方法和算法来完成此类任务?
方法一
余弦相似度 给出的相似度得分介于 (0 - 1) 之间。
我首先将图像转换为灰度并对其进行二值化。我将原始图像裁剪为一半大小并排除了文本,如下所示:
然后我使用 flatten()
将图像数组转换为一维数组。我使用以下方法计算 余弦相似度 :
from scipy import spatial
result = spatial.distance.cosine(im2, im1)
print result
我得到的结果是0.999999988431,这意味着图像在这个分数上彼此相似。
编辑
方法二
我有时间查看另一个解决方案。我发现 OpenCV 的 cv2.matchTemplate()
函数执行相同的工作。
如果您查看 THIS DOCUMENTATION PAGE,您会发现所使用的不同参数。
我使用了 cv2.TM_SQDIFF_NORMED
参数(它给出了两个图像之间的归一化平方差)。
res = cv2.matchTemplate(th1, th2, cv2.TM_SQDIFF_NORMED)
print 1 - res
对于给定的图像,我获得的相似度得分为:0.89689457