Получите или рассчитайте энтропию изображения с помощью Ruby и imagemagick - PullRequest
5 голосов
/ 08 февраля 2011

Как найти «энтропию» с помощью imagemagick, предпочтительно mini_magic, в Ruby? Мне нужно это как часть более крупного проекта: найти «интересность» на изображении, чтобы обрезать его .

Я нашел хороший пример в Python / Django , который дает следующий псевдокод:

image = Image.open('example.png')
histogram = image.histogram() # Fetch a list of pixel counts, one for each pixel value in the source image

#Normalize, or average the result.
for each histogram as pixel
  histogram_recalc << pixel / histogram.size
endfor

#Place the pixels on a logarithmic scale, to enhance the result.
for each histogram_recalc as pixel
  if pixel != 0
    entropy_list << log2(pixel)
  endif
endfor

#Calculate the total of the enhanced pixel-values and invert(?) that.
entropy = entroy_list.sum * -1

Это будет переводиться в формулу entropy = -sum(p.*log2(p)).

Мои вопросы: Правильно ли я интерпретировал код Django / Python? Как я могу получить гистограмму в mini_magick ruby, если вообще?

Самый важный вопрос: хорош ли этот алгоритм вообще? Вы бы предложили лучший способ найти «энтропию» или «количество изменяющихся пикселей» или «глубину градиента» в (части) изображениях?

Редактировать : Используя a.o. На ресурсы, предоставленные ответом ниже, я придумал рабочий код:

# Compute the entropy of an image slice.
def entropy_slice(image_data, x, y, width, height)
  slice = image_data.crop(x, y, width, height)
  entropy = entropy(slice)
end

# Compute the entropy of an image, defined as -sum(p.*log2(p)).
# Note: instead of log2, only available in ruby > 1.9, we use
# log(p)/log(2). which has the same effect.
def entropy(image_slice)
  hist = image_slice.color_histogram
  hist_size = hist.values.inject{|sum,x| sum ? sum + x : x }.to_f

  entropy = 0
  hist.values.each do |h|
    p = h.to_f / hist_size
    entropy += (p * (Math.log(p)/Math.log(2))) if p != 0
  end
  return entropy * -1
end

Где image_data это RMagick::Image.

Используется в smartcropper gem , который позволяет выполнять умную нарезку и обрезку изображений, например, с. PAPERCLIP.

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Энтропия объясняется здесь (с помощью источника MATLAB, но, надеюсь, поможет качественное объяснение):

Введение в энтропию (Data Mining в MATLAB)

Для более формального объяснения см .:

"Элементы теории информации" (глава 2) , автором Обложки и Томаса

0 голосов
/ 29 октября 2016

С гранями Array#entropy:

require 'facets'
puts File.read('path/to/image.png').chars.entropy
...