fsc*_*ndt 0 ruby image-processing vips
我正在尝试比较两个图像,看看它们是否相同。它们应该具有相同的尺寸,可能具有相同的尺寸,但是内容有时会更改,我希望能够检测到它。
在我的情况下,有两种处理方法:一种是获取每个图像中的颜色数量。(在我的情况下,如果图像不同,则颜色数量会发生变化)
或者确实要使用图像处理器比较文件。我之所以选择使用ruby-vips8它,是因为它比快很多RMagick,在我看来,性能是一回事。
我用做了一些划痕,ruby-vips8但是找不到比较两个图像或获取颜色数量的方法(因此可以使用此方法进行比较)。
有什么帮助吗?
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的答案更为合适。
必须有数百种测量图像相似性的方法,这是一个广阔的领域。它们(主要是)在尝试考虑图像的特征方面有所不同。
正如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和朋友。它们对于查找图像的较小区域可能更有用。
许多更奇特的图像相似性指标将采用各种算法,全部运行它们,并使用一组加权因子来计算整体相似性度量。