使用ruby-vips8是否可以检测两个图像是否相同?

fsc*_*ndt 0 ruby image-processing vips

我正在尝试比较两个图像,看看它们是否相同。它们应该具有相同的尺寸,可能具有相同的尺寸,但是内容有时会更改,我希望能够检测到它。

在我的情况下,有两种处理方法:一种是获取每个图像中的颜色数量。(在我的情况下,如果图像不同,则颜色数量会发生变化)

或者确实要使用图像处理器比较文件。我之所以选择使用ruby-vips8它,是因为它比快很多RMagick,在我看来,性能是一回事。

我用做了一些划痕,ruby-vips8但是找不到比较两个图像或获取颜色数量的方法(因此可以使用此方法进行比较)。

有什么帮助吗?

红宝石vips8是一个包装libvips

http://www.rubydoc.info/gems/ruby-vips8/0.1.0/Vips/ http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS

更新:

有了用户Aetherus的回答,我才意识到我什ruby-vips8至不需要执行此类任务。我正在将文件比较为String(如他的建议)。这对我来说很棒,而且速度也非常快。

我没有将他的答案标记为最好,因为我的问题询问是否可以使用来做ruby-vips8。这是一个特定于lib的场景,因此在这种情况下,user894763的答案更为合适。

jcu*_*itt 5

必须有数百种测量图像相似性的方法,这是一个广阔的领域。它们(主要是)在尝试考虑图像的特征方面有所不同。

正如Scott所说,一系列相似性度量都是基于直方图的。这些技术没有考虑像素的空间排列方式,因此,如果将一张图像旋转45度,则可以认为两张图像是相同的。它们也很快,因为找到直方图很快。

一个简单的直方图匹配器可能是:找到两个输入图像的直方图,进行归一化(这样两个直方图具有相同的面积...这样就可以消除图像大小的差异),减法,平方和和。现在,较小的数字表示匹配不错,较大的数字表示匹配越来越差。

ruby-vip中,这将是:

require 'vips'

a = Vips::Image.new_from_file ARGV[0], access: :sequential
b = Vips::Image.new_from_file ARGV[1], access: :sequential

# find hists, normalise, difference, square
diff_hist = (a.hist_find.hist_norm - b.hist_find.hist_norm) ** 2

# find sum of squares ... find the average, then multiply by the size of the
# histogram
similarity = diff_hist.avg * diff_hist.width * diff_hist.height

puts "similarity = #{similarity}"
Run Code Online (Sandbox Code Playgroud)

在我的桌面上,这对一对2k x 3k JPEG图像的运行时间约为0.5s。

许多匹配器基于空间分布。一种简单的方法是将图像分成8x8的网格(如国际象棋棋盘),取每个正方形的平均像素值,然后根据正方形的平均值是高于还是低于该正方形将其设置为0或1。整个图像的平均值。这为图像提供了类似指纹的标记,您可以将其整齐地存储在64位int中。它对诸如噪音,缩放比例变化或小旋转之类的东西不敏感。

要测试两个图像的相似性,请对其指纹进行XOR运算,并计算结果中设置的位数。同样,0将是一个完美的匹配,较大的数字将不太理想。

在ruby-vip中,您可以将其编码为:

require 'vips'

a = Vips::Image.new_from_file ARGV[0], access: :sequential

# we need a mono image
a = a.colourspace "b-w"

# reduce to 8x8 with a box filter
a = a.shrink(a.width / 8, a.height / 8)

# set pixels to 0 for less than average, 255 for greater than average
a = a > a.avg

a.write_to_file ARGV[1]
Run Code Online (Sandbox Code Playgroud)

同样,对于2k x 3k JPEG,这大约需要0.5s的时间。

另一个家庭将基于相关性,请见spcor和朋友。它们对于查找图像的较小区域可能更有用。

许多更奇特的图像相似性指标将采用各种算法,全部运行它们,并使用一组加权因子来计算整体相似性度量。