编辑:我相信我没有正确说出我的问题,所以这是编辑。
我希望能够在一个图像的宽度和高度方面比较(和评分)一组图像。
理想情况下,我会有一个BASE_SCORE值(例如100),用于为每个图像打分,具体取决于它们与主图像的接近程度(宽度和高度)。
因此,例如,如果主图像看起来像{:width => 100, :height => 100}
,而set_images看起来像[{:width => 100, :height => 100}, {:width => 10, :height => 40}]
,则第一个元素的得分为BASE_SCORE,因为它们看起来完全相同。
我没有看到如何比较宽度/高度以获得set_images的每个元素。
答案 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}]