我正在使用照片库,我想要一些计算细节的方法。每个图像的整体价值。细节,我的意思是对比色,阴影和边缘的数量,使得单个平面颜色的图像将具有0个细节,并且填充有许多小元素的照片将具有高细节值。
这不必非常精确 - 我想识别具有高于某个阈值的细节值的图像,并以不同方式对待它们。合理的猜测就足够了。
我有一些可行的想法:
将图像保存为给定大小和压缩级别的JPG,并检查生成的文件大小。这基本上使用压缩算法作为检查 - 详细图像制作大文件。似乎既缓慢,昂贵又粗糙,但它不需要大量的定制工作。
将图像细分为网格,在每个方格内采样点,并比较其值的唯一性。它似乎可以工作,但需要一个精细的网格和大量的样本才能发挥作用。
使用像锐化遮罩这样的边缘检测滤镜:拍摄原始照片,并使用已知量的锐化,然后取每张照片的平均颜色。如果它们非常不同,那么过滤器已经做了大量的工作'因此图像有很多边缘(因此很多细节)。这似乎很有希望,但我不确定它是否真的有效!
处理将在带外进行,因此性能不是一个大问题。如果每张图片需要几秒钟,那很好。我使用rMagick(imageMagick)和Ruby。
我错过了什么吗?有更简单的方法吗?
答案 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倍。需要找到更好的方法。