分析图像复杂性

时间:2010-03-10 20:33:36

标签: perl imagemagick

是否有可用于分析图像复杂度的算法?基本上我正在编写一个Perl脚本,它将使用system()函数在后台启动MPlayer,为输入视频文件生成10到20个屏幕截图,我希望它能够丢弃任何简单的图像,如拍摄天空,或黑色背景,以及其他简单的图像,并保留其中3个具有最高复杂性或大多数颜色的图像。我可以用一个模块或单独的程序来实现这个目标吗?我猜也许Image :: Magick可以照顾这个。

5 个答案:

答案 0 :(得分:10)

查看JPEG压缩副本的小小。 JPEG很难去除图像信息中的冗余,而“复杂”图像根本没有足够的冗余来删除。

答案 1 :(得分:3)

关于这个问题的优秀论文here。它考虑了在军事应用中匹配图像的更窄的问题,但调查研究并包含许多不同作者所考虑的图像复杂度指标。您可能只需要特定任务中的一种或两种方法。看看这个。

答案 2 :(得分:1)

我的第一个答案是JPEG方法,但有人已经提出过,所以我的下一个答案是计算直方图($image->Histogram())。只需查看图像中不同颜色的数量即可。对于照片(像天空这样的东西),图像中的颜色越多,它就越复杂。

答案 3 :(得分:0)

你可能会考虑做一个FFT并在图像中寻找高频信息...这会让你大致了解复杂性。

答案 4 :(得分:0)

我不知道现成的库方法,但有一些算法来衡量这个......

您可以尝试将每个颜色通道分别添加一个像素与下一个像素的差异的绝对值。那么具有最高结果的样本图像将获胜。不过,这将是非常粗略测量...

一些伪代码,因为我不知道perl:

complexity = 0
// image coordinates start at [0,0]
for x = 1 to image.max_x:
   for y = 1 to image.max_y:
       complexity += abs(image[x,y].red - image[x,y-1].red)
       complexity += abs(image[x,y].red - image[x-1,y].red)
       complexity += abs(image[x,y].blue - image[x,y-1].blue)
       complexity += abs(image[x,y].blue - image[x-1,y].blue)
       complexity += abs(image[x,y].green - image[x,y-1].green)
       complexity += abs(image[x,y].green - image[x-1,y].green)