如何计算图像中的整体细节数量?

时间:2015-06-05 14:09:53

标签: image image-processing imagemagick

我正在使用照片库,我想要一些计算细节的方法。每个图像的整体价值。细节,我的意思是对比色,阴影和边缘的数量,使得单个平面颜色的图像将具有0个细节,并且填充有许多小元素的照片将具有高细节值。

这不必非常精确 - 我想识别具有高于某个阈值的细节值的图像,并以不同方式对待它们。合理的猜测就足够了。

我有一些可行的想法:

  • 将图像保存为给定大小和压缩级别的JPG,并检查生成的文件大小。这基本上使用压缩算法作为检查 - 详细图像制作大文件。似乎既缓慢,昂贵又粗糙,但它不需要大量的定制工作。

  • 将图像细分为网格,在每个方格内采样点,并比较其值的唯一性。它似乎可以工作,但需要一个精细的网格和大量的样本才能发挥作用。

  • 使用像锐化遮罩这样的边缘检测滤镜:拍摄原始照片,并使用已知量的锐化,然后取每张照片的平均颜色。如果它们非常不同,那么过滤器已经做了大量的工作'因此图像有很多边缘(因此很多细节)。这似乎很有希望,但我不确定它是否真的有效!

处理将在带外进行,因此性能不是一个大问题。如果每张图片需要几秒钟,那很好。我使用rMagick(imageMagick)和Ruby。

我错过了什么吗?有更简单的方法吗?

2 个答案:

答案 0 :(得分:2)

你可以尝试测量熵,看看它对你的图像是如何起作用的 - 虽然很难说出它对你的需求有多好。

你得到ImageMagick来测量它:

identify -format '%[entropy]' input.jpg

您也可以使用convert工具进行衡量:

convert -size 100x100 xc:white gradient:red-blue +append -print '%[entropy]' null:

或者你可以做一个Canny边缘检测,然后计算得到的黑白图像的平均值,它将告诉你像素的边缘百分比是0-100之间的整数,如下所示:

convert input.jpg -canny 0x1+10%+30% -format "%[fx:int(mean*100)]" info:
12

根据Kurt的建议,您还可以查看唯一颜色的数量除以像素数。对于照片类型的图像,这显然会给大块恒定颜色和较大结果带来小的结果。

identify -format "%k different colors, %w (width), %h (height)\n" image.jpg 

答案 1 :(得分:2)

我喜欢边缘检测建议-

convert input.jpg -canny 0x1+10%+30% -format "%[fx:int(mean*100)]" info:

但是,这有一些很大的缺点。最大的是,您获得的值在很大程度上取决于图像的大小。

作为参考,我有兴趣使用它来客观地衡量藏语唐卡的细节水平。唐卡的价格非常取决于画家画的时间,而这反过来又很大程度上取决于画中细节的数量。细节越艰苦,绘制唐卡所需的时间就越长。一个细节很多的唐卡可能需要一年多的时间。另一个大小相同但细节却少得多的唐卡只需要一个星期。

要有用,此度量必须根据照片的大小进行缩放-如果您拥有十亿像素的照片,就如同拥有百万像素的照片一样,只要您有足够的分辨率可以看到照片,它应该给出相同的答案。画中最小的细节。

我第一次使用ImageMagick是:

magick convert pic.jpg -canny 0x1+10%+30% -format "%[fx:mean*sqrt(w*h)]" info:

当我对此图像进行测试时,它工作得很好。 multi-star picture

当我将图像缩放2倍时,我得到的图像的值相同;当我将图像缩小10%时,我得到的图像的值非常接近...但是由于某些细节,该数字更小当您按比例缩小时将被消除。

不幸的是,当我在实际的thangka图像上尝试时,效果不佳: Actual thangka

当我扩大规模时,我得到的结果截然不同-高达1.5倍。需要找到更好的方法。