使用命令行ImageMagick检测图像饱和度并输出到JSON

时间:2015-10-25 15:50:30

标签: json command-line imagemagick imagemagick-convert

我正在尝试获取图像的饱和度,以计算它是否更接近灰度或颜色。这需要适用于任何图像文件格式。我还需要能够获取其他信息,包括文件类型,mime类型,宽度,高度以及可能的感知哈希时刻。它还需要保留JSON输出。

目前我正在使用convert image.png json:-输出我需要的几乎所有数据,但图像饱和度除外。我试过convert image.png -colorspace HSL json:-,假设它会将通道从红色,绿色和蓝色(和灰色)改变为色调,饱和度和亮度,但它仍然是前者。

使用RGB色彩空间时,灰度图像只返回两个channelStatistics,alpha和gray,而彩色图像返回alpha,red,green和blue。使用HSL时,它会以灰度和颜色返回alpha,red,green和blue,格式如下(这是一个灰度示例):

[channelStatistics] -> Object
(
    [alpha] => stdClass Object
        (
            [min] => 255
            [max] => 255
            [mean] => 255
            [standardDeviation] => 0
            [kurtosis] => 0
            [skewness] => 0
        )

    [red] => stdClass Object
        (
            [min] => 0
            [max] => 0
            [mean] => 0
            [standardDeviation] => 0
            [kurtosis] => 0
            [skewness] => 0
        )

    [green] => stdClass Object
        (
            [min] => 0
            [max] => 0
            [mean] => 0
            [standardDeviation] => 0
            [kurtosis] => 0
            [skewness] => 0
        )

    [blue] => stdClass Object
        (
            [min] => 20
            [max] => 255
            [mean] => 230.007
            [standardDeviation] => 44.1297
            [kurtosis] => 2.21673
            [skewness] => -1.80749
        )

)

什么命令会返回我需要的信息?我不想改变原始图像;它需要保持不变。我只需要获得这些细节。

1 个答案:

答案 0 :(得分:2)

当你这样做时

convert input.png -colorspace hsl json:

输出实际上是在HSL中,除非它有些误导,标记为红色,绿色和蓝色。

你可以通过创建一个非常红的图像来测试这一点,但是它有一些变化,以便IM不能将它编码为像这样的palettised图像:

convert -size 1000x1000 gradient:"rgb(255,0,0)-rgb(230,10,0)" input.png

现在,如果你看一下JSON,它看起来像这样 - 很大程度上是完全饱和的亮红色

"channelStatistics": {
  "red": {
    "min": "59110",
    "max": "65535",
    "mean": "62322.5",
    "standardDeviation": "1856.6",
    "kurtosis": "-1.19999",
    "skewness": "1.52719e-06"
  },
  "green": {
    "min": "0",
    "max": "2570",
    "mean": "1285",
    "standardDeviation": "742.641",
    "kurtosis": "-1.19999",
    "skewness": "0"
  },
  "blue": {
    "min": "0",
    "max": "0",
    "mean": "0",
    "standardDeviation": "0",
    "kurtosis": "0",
    "skewness": "0"
  }
},

如果您转换为HSL

convert input.png -colorspace hsl json:

现在看起来像这样:

"channelStatistics": {
  "red": {
    "min": "0",
    "max": "475",
    "mean": "229.308",
    "standardDeviation": "137.131",
    "kurtosis": "-1.19385",
    "skewness": "0.071888"
  },
  "green": {
    "min": "65535",
    "max": "65535",
    "mean": "65535",
    "standardDeviation": "0",
    "kurtosis": "0",
    "skewness": "0"
  },
  "blue": {
    "min": "29555",
    "max": "32768",
    "mean": "31161.5",
    "standardDeviation": "928.298",
    "kurtosis": "-1.20001",
    "skewness": "1.58408e-08"
  }
},

它可能出售为红色,绿色和蓝色,但实际上“红色”是 Hue 接近于零,即红色和“绿色” “实际上是饱和度,你可以看到它完全饱和,而”蓝色“是亮度,它是灰色的中间。