Làm thế nào để tìm "entropy" với imagemagick, tốt nhất là mini_magic, trong Ruby? Tôi cần điều này như một phần của dự án lớn hơn, tìm "sự thú vị" trong một hình ảnh để cắt nó.Nhận, hoặc tính toán entropy của một hình ảnh với Ruby và imagemagick
Tôi tìm thấy một tốt example in Python/Django, mang đến cho các pseudo-code sau:
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
này sẽ dịch công thức entropy = -sum(p.*log2(p))
.
Câu hỏi của tôi: Tôi có giải thích mã Django/Python chính xác không? Làm thế nào tôi có thể lấy một biểu đồ trong mini_magick của ruby nếu có?
Câu hỏi quan trọng nhất: thuật toán này có tốt hay không ngay từ đầu? Bạn có gợi ý một cái tốt hơn để tìm "entropy" hoặc "số lượng pixel thay đổi" hoặc "độ sâu gradient" trong (các phần của) hình ảnh không?
Chỉnh sửa: Sử dụng a.o. tài nguyên được cung cấp bởi câu trả lời bên dưới, tôi đã đưa ra mã làm việc:
# 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
Nơi image_data là RMagick::Image
.
Điều này được sử dụng trong smartcropper gem, cho phép cắt và cắt thông minh cho hình ảnh, ví dụ: kẹp giấy.
Cảm ơn thực sự hữu ích. Kỹ năng Matlab của tôi hơi bị gỉ, nhưng tôi đang quản lý tốt, dịch nó thành Ruby (và phát lại trong FreeMat). – berkes