Jak znaleźć "entropię" za pomocą imagemagick, najlepiej mini_magic, w Ruby? Potrzebuję tego jako części większego projektu, znajdowanie "ciekawości" na obrazku, aby go przyciąć.Uzyskaj lub oblicz entropię obrazu za pomocą Ruby i imagemagick
mogę znaleźć dobry example in Python/Django, która daje następujące pseudokod:
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
to przekłada wzoru entropy = -sum(p.*log2(p))
.
Moje pytania: Czy poprawnie odczytałem kod Django/Pythona? Jak mogę pobrać histogram w mini_magick'u ruby, jeśli w ogóle?
Najważniejsze pytanie: czy ten algorytm jest w ogóle dobry? Czy lepiej zaproponowałbyś "entropię" lub "ilość zmieniających się pikseli" lub "głębokość gradientu" w (częściach) obrazów?
Edytuj: Korzystanie z pliku a.o. środki przewidziane w poniższej odpowiedzi, wpadłem z kodem roboczym:
# 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
Gdzie image_data jest RMagick::Image
.
Jest używany w smartcropper gem, który umożliwia inteligentne cięcie i przycinanie obrazów zawierających np. spinacz.
Dzięki bardzo przydatne. Moje umiejętności Matlab są nieco zardzewiałe, ale radzę sobie dobrze, tłumacząc je na Ruby (i odtwarzając w FreeMat). – berkes