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

2023-12-06

如何在 Ruby 中使用 imagemagick(最好是 mini_magic)找到“熵”?我需要这个作为一个更大项目的一部分,找到图像中的“有趣之处”以便裁剪它.

我找到了一个好的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​​ minimagick 中获取直方图?

最重要的问题:这个算法首先好吗?您是否会建议一种更好的方法来查找图像(部分)中的“熵”或“像素变化量”或“梯度深度”?

Edit:使用 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.

这用于聪明作物宝石,它允许对图像进行智能切片和裁剪,例如回形针。


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

熵简介(MATLAB 中的数据挖掘)

更正式的解释请参见:

《信息论要素》(第二章),作者:盖尔和托马斯

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ruby 和 imagemagick 获取或计算图像的熵 的相关文章

随机推荐

  • 扫描直到新行

    我想读取输入的所有文本 直到输入新行字符 这是我的代码 int i 0 char ch MAX printf Enter the text n while true scanf c ch i if ch i n break i 但当我尝试执
  • Clang 3.7.0 抱怨类不是字面意思,因为它不是聚合并且没有 constexpr 构造函数

    以下代码在 GCC 4 9 3 和 VC 19 00 23506 中编译良好 但在 Clang 3 7 0 中给出这些错误 错误 constexpr 函数的返回类型 Foo 不是文字类型 注意 Foo 不是字面意思 因为它不是聚合并且没有
  • C++ 中的向量初始化

    我在代码中使用向量 导致错误的行如下 vector
  • 如何使用 Vbscript 重写和写入文本文件

    我使用以下 VBscript 在 commonapplicationdatafolder 中创建了一个文本文件 list txt 我正在显示一些 通过写入文本文件来获取变量 strlist 的值 Const Value H23 Const
  • 使用 NSXMLParser initWithStream:未收到解析器委托方法

    我正在解决的基本问题是使用NSStream用于解析传入的增量 XML 数据的类 数据从来都不是完整的 XML 文档 但我希望根据套接字可以读取的数据量以增量块的形式接收和处理它 查看文档NSXMLParser 看起来像initWithStr
  • 如何使用 24 块色卡估计和应用色彩校正矩阵?

    我有一个 24 块色卡 我正在尝试使用所述色卡估计捕获图像的颜色校正矩阵 我已经手动估计了CCM使用least squares方法 但它没有产生理想的结果 有些图像在应用后会出现奇怪的阴影CCM 我仔细检查了我的代码 但没有发现任何问题 我
  • 将 grep 结果打印到文件和终端

    我正在尝试将 grep 结果显示到终端以及文件中 我提出的解决方案是只运行两次 但这显然会产生效率问题 grep n SEARCH TERM i grep n SEARCH TERM i gt gt file txt 是否有一个标签允许它仅
  • alert() 返回与 console.log() 不同吗?

    我应该使用alert 进行调试吗 或者是否有时间使用alert 与console log 我看到alert 和console log 可以返回不同的结果 我认为它们是类似的功能 但只是在不同的地方返回 背景故事 我的老板喜欢在开发过程中看到
  • 是否可以在Java中为数字框类型编写通用的+1方法?

    这不是家庭作业 Part 1 是否可以编写一个通用方法 如下所示
  • 搜索非 ASCII 字符

    我有一个文件 a out 其中包含多行 每一行只有一个字符 要么是 unicode 字符U 2013或小写字母a z 对 a out 执行文件命令会得到结果 UTF 8 Unicode 文本 locale 命令报告 LANG en US U
  • android应用程序可以只有广播接收器和服务而没有活动吗

    Android应用程序可以只有广播接收器和服务而没有活动吗 如果这是可能的 我如何调用广播接收器 Android 系统自动调用broadcsat 接收器 广播接收者代码 public class CheckReceiver extends
  • 在 opencart 中获取第三级类别

    我想要foreachOpenCart 类别模块的第三级 这是仅生成 2 级类别的代码 请帮助并修改 以便生成第三级 ul li a href a ul ul li ul
  • 如果没有 javascript 没有返回内容,如何隐藏 iframe

    我正在尝试制作一个具有特定大小的内容区域 但如果 api 返回的结果是 我希望不显示任何内容empty 这是 html 的代码 div class myclass div 我调用的 API 有时可能会返回 null 结果 JavaScrip
  • Curl : * 违反 RFC 2616/10.3.2 并从 POST 切换到 GET

    我正在使用curl 发布到脚本 curl setopt ch CURLOPT POST true curl setopt ch CURLOPT URL url curl setopt ch CURLOPT RETURNTRANSFER 1
  • 连接误差线的平均点

    在 ggplot2 中 我正在尝试做一件简单的事情 但由于某种原因我无法做到 我已经在数据框中调整了均值和 SE 并且想要绘制均值 误差线 然后将均值与点连接起来 这是代码和错误 除了将方法与geom line 与RC食谱 library
  • 无法使用 yum 或 rpm 在 Fedora 上安装 jdk

    帮助 我不知道如何安装jdk usr lib jvm su c yum install java 1 7 0 openjdk devel Loaded plugins langpacks presto refresh packagekit
  • XSLT 在没有命名空间的情况下复制元素

    首先我要说明的是 我并不是特别擅长 XSLT 但我想做的是将 3 个 XML 文档复制到一个父文档中 XSLT 工作正常 只是父节点使用 xmlns 属性打印 这导致我的验证失败 所以我的问题是如何从单独的文档中复制这些元素而不添加 xml
  • XML DOM文档优化

    我有一个 5MB 的 XML 文件 我使用以下代码来获取所有nodeValue dom new DomDocument 1 0 UTF 8 if dom gt load url return games dom gt getElements
  • 边框半径以百分比 (%) 和像素 (px) 或 em 表示

    如果我使用一个像素或em值对于边界半径 边缘半径始终为圆弧 or a 药丸形状即使该值大于元素的最大边 当我使用百分比 边缘半径是椭圆形的 并从元素每条边的中间开始 从而产生卵形或椭圆形 边框半径的像素值 div background te
  • 使用 Ruby 和 imagemagick 获取或计算图像的熵

    如何在 Ruby 中使用 imagemagick 最好是 mini magic 找到 熵 我需要这个作为一个更大项目的一部分 找到图像中的 有趣之处 以便裁剪它 我找到了一个好的Python Django 中的示例 给出以下伪代码 imag