我想比较下面的图片之间的相似性。根据我的要求,我想确定所有这些图像相似,因为它使用相同的颜色,相同的剪贴画。这些图像的唯一区别是旋转、缩放和剪贴画的放置。由于所有3件T恤都使用了相同的颜色和剪贴画,我想确定所有3个图像相似。我尝试了hackerfactor.com中描述的方法。但它没有给予我正确的结果根据我的要求。如何识别所有这些图像是否相似?你有什么建议吗?请帮帮我
下面的图片应被识别为与上面的图片不同。(即使T恤具有相同的颜色,剪贴画也不同。最后一件T恤与上面的不同,因为它使用了相同的剪贴画,但使用了两次。)
5条答案
按热度按时间vsmadaxz1#
迁移到GitHub
因为这个问题很有趣,所以我把它移到了GitHub上,在那里你可以找到当前的实现:ImageCompare
原始答案
我做了一个非常简单的方法,使用img-resize并比较调整大小的图像的平均颜色。
对于使用的尺寸和颜色公差,我得到了预期的结果:
高级实现
空T恤比较:
结果:
在该计算中,背景被忽略,这导致平均颜色的更大差异。
最终实现(OOP)
很有趣的主题。所以我试着把它调高一点。现在这是一个完整的OOP实现。现在您可以创建一个新的图像,并减去它的一些面具,以消除背景。然后,您可以使用比较方法将一个图像与另一个图像进行比较。为了限制计算,最好先调整图像的大小(蒙版总是适合当前图像)
比较算法本身将两个图像分块成若干图块,然后消除几乎等于白色平均颜色的图块,然后比较所有剩余图块排列的平均颜色。
结果:
bq3bfh9z2#
我并不是说我真的了解这个主题,我认为这个主题通常被称为“视觉”。
然而,我会做的是沿着这些路线:
流量:
后验,最小数量的颜色/阴影(猜测)。
**删除两个最大的颜色(白色+衬衫)。
**比较剩余调色板,如果方案相差太大,则失败。
**计算围绕任何剩余的“color-blob”的粗略多边形(参见https://en.wikipedia.org/wiki/Convex_hull)
**比较*个多边形和最大多边形的Angular 和Angular 值(不是大小)的数量,从每个图像,失败或通过。
在这样的设置中的主要问题,将是舍入…就像在给一种颜色上色时,它正好在两种颜色之间的中点……有时候是A色有时候是B色多边形也一样,我想。
vtwuwzda3#
SIMILAR计算两个相等尺寸的图像之间的归一化互相关相似性度量。归一化的互相关度量测量两个图像有多相似,而不是它们有多不同。如果mode=g,则两个图像将被转换为灰度。如果mode=rgb,则两个图像首先将被转换为colorspace=rgb。接下来,将针对每个信道计算ncc相似性度量。最后,它们将合并为均方根值。注意:此度量不适用于恒定颜色通道,因为它为该通道产生ncc度量= 0/0。因此,不建议在启用了完全不透明或完全透明Alpha通道的情况下运行脚本。
试试这个API
wb1gzix04#
正如有人提到的,除了计算图像的直方图并比较它们之外,其他任何事情都不容易实现。下面是一个例子,给出了所提供的图像的正确结果。这里的关键点是如何在峰值颜色级别的数量和它们的可接受数量(
similarity( $histograms, $levels = 30, $enough = 28 )
)之间获得正确的平衡。This article也帮助我创建直方图。
1rhkuytd5#
对于php 8.1或更高版本,您可以使用https://github.com/sapientpro/image-comparator库。它具有
detect()
函数,该函数将您正在比较的图像旋转4次90度,并返回最高的相似度百分比: