2011-02-08 29 views
5

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.

Trả lời

1

Entropy được giải thích ở đây (với nguồn MATLAB, nhưng hy vọng lời giải thích định tính giúp):

Introduction to Entropy (Data Mining in MATLAB)

Đối với một lời giải thích chính thức hơn, xem:

"Elements of Information Theory" (Chapter 2), bởi Bìa và Thomas

+1

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

Các vấn đề liên quan