gpt4 book ai didi

ruby - 使用 Ruby 和 imagemagick 获取或计算图像的熵

转载 作者:数据小太阳 更新时间:2023-10-29 07:19:36 24 4
gpt4 key购买 nike

如何在 Ruby 中使用 imagemagick,最好是 mini_magic 找到“熵”?我需要将其作为更大项目的一部分,在图像中找到“有趣之处”以便对其进行裁剪

我找到了一个很好的example in 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 代码的解释是否正确?如果有的话,我怎样才能在 ruby​​ 的 mini_magick 中获取直方图?

最重要的问题:这个算法首先有什么好处吗?你会建议一个更好的方法来找到(部分)图像中的“熵”或“像素变化量”或“梯度深度”吗?

编辑:使用 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 ,它允许对图像进行智能切片和裁剪,例如回形针。

最佳答案

此处解释了熵(使用 MATLAB 源代码,但希望定性解释有所帮助):

Introduction to Entropy (Data Mining in MATLAB)

更正式的解释,参见:

"Elements of Information Theory" (Chapter 2) , 封面和托马斯

关于ruby - 使用 Ruby 和 imagemagick 获取或计算图像的熵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4935380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com