比较两个图像的宽度和高度

时间:2014-01-23 20:56:09

标签: ruby image aspect-ratio

编辑:我相信我没有正确说出我的问题,所以这是编辑。

我希望能够在一个图像的宽度和高度方面比较(和评分)一组图像。

理想情况下,我会有一个BASE_SCORE值(例如100),用于为每个图像打分,具体取决于它们与主图像的接近程度(宽度和高度)。

因此,例如,如果主图像看起来像{:width => 100, :height => 100},而set_images看起来像[{:width => 100, :height => 100}, {:width => 10, :height => 40}],则第一个元素的得分为BASE_SCORE,因为它们看起来完全相同。

我没有看到如何比较宽度/高度以获得set_images的每个元素。

2 个答案:

答案 0 :(得分:1)

使用欧几里德距离是否有问题?零代表平等:

def euclidean_distance(a, b)
  dx = a[:width] - b[:width]
  dy = a[:height] - b[:height]
  Math.sqrt((dx * dx) + (dy * dy))
end

test_subject = { width: 200, height: 50 }
samples = [
  { width: 100, height: 100 },
  { width: 80,  height: 200 },
  { width: 200, height: 50 },
  { width: 10,  height: 10 }
]

distances = samples.map { |s| euclidean_distance(test_subject, s) }

samples.zip(distances) { |img, dist| puts "#{img[:width]}x#{img[:height]} => #{dist}" }

输出:

100x100 => 111.80339887498948
80x200 => 192.09372712298546
200x50 => 0.0
10x10 => 194.164878389476

然后,您可以轻松地使用sort

sorted = samples.sort { |a, b| euclidean_distance(test_subject, a) <=> euclidean_distance(test_subject, b) }

答案 1 :(得分:0)

这样的事似乎有效。请原谅格式......

$ cat foo.rb
require 'pp'

main_image = {:width => 100, :height => 50}
set_of_images = [{:width => 200, :height => 300, :id => 2}, 
                 {:width => 100, :height => 50, :id => 9}]

aspect_ratio = main_image[:width] / main_image[:height].to_f

sorted_images = set_of_images.
                  map{|i| i[:score] = (aspect_ratio - i[:width]/i[:height].to_f).abs; i}.
                  sort_by{|i| i[:score]}

pp sorted_images

$ ruby foo.rb
[{:width=>100, :height=>50, :id=>9, :score=>0.0},
 {:width=>200, :height=>300, :id=>2, :score=>1.3333333333333335}]