Python-wand:如何读取图像属性/统计信息

时间:2014-10-16 12:32:47

标签: python image-processing statistics imagemagick wand

我正在尝试提取图像的统计数据,例如“均值”,“标准偏差”等。 但是,我在python-wand文档中找不到任何与之相关的内容。

从命令行我可以获得如下统计信息:

convert MyImage.jpg -format '%[standard-deviation], %[mean], %[max], %[min]' info:

convert MyImage.jpg -verbose info:

如何使用wand从python程序获取此类信息?

2 个答案:

答案 0 :(得分:2)

目前,不支持ImageMagick的C-API(histogramEXIF之外)的任何统计方法。幸运的是wand.api提供了扩展功能。

  1. 在MagickWand的文档中找到method you need
  2. 使用ctypes实现数据类型/结构(reference header .h files
  3. from wand.api import library
    import ctypes
    
    class ChannelStatistics(ctypes.Structure):
        _fields_ = [('depth', ctypes.c_size_t),
                    ('minima', ctypes.c_double),
                    ('maxima', ctypes.c_double),
                    ('sum', ctypes.c_double),
                    ('sum_squared', ctypes.c_double),
                    ('sum_cubed', ctypes.c_double),
                    ('sum_fourth_power', ctypes.c_double),
                    ('mean', ctypes.c_double),
                    ('variance', ctypes.c_double),
                    ('standard_deviation', ctypes.c_double),
                    ('kurtosis', ctypes.c_double),
                    ('skewness', ctypes.c_double)]
    
    library.MagickGetImageChannelStatistics.argtypes = [ctypes.c_void_p]
    library.MagickGetImageChannelStatistics.restype = ctypes.POINTER(ChannelStatistics)
    
    1. 扩展wand.image.Image,并使用新支持的方法。
    2. from wand.image import Image
      
      class MyStatisticsImage(Image):
          def my_statistics(self):
              """Calculate & return tuple of stddev, mean, max, & min."""
              s = library.MagickGetImageChannelStatistics(self.wand)
              # See enum ChannelType in magick-type.h
              CompositeChannels = 0x002F
              return (s[CompositeChannels].standard_deviation,
                      s[CompositeChannels].mean,
                      s[CompositeChannels].maxima,
                      s[CompositeChannels].minima)
      

答案 1 :(得分:1)

请注意@emcconville提出的优秀建议:

  1. imagemagick网站上的文档适用于v7.x
  2. 魔杖仅适用于imagemagick 6.x
  3. 在IM6.x中,_ChannelStatistics末端实际上还有一个字段,一个名为entropy的双字段,如果你将它从ChannelStatistics声明中删除,你的结构将无法与你得到的结果正确对齐它会包含一堆废话