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

Detecting images saturation level with command line ImageMagick and outputting to JSON

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

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

使用 RGB 色彩空间时,灰度图像 return 只有两个 channelStatistics,alpha 和灰色,而彩色图像 returns alpha,红色,绿色和蓝色。使用 HSL 时,它 returns 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
        )

)

什么命令会 return 我需要的信息?我不想改变原始图像;它需要保持不变。我只需要了解这些特定的细节。

当你

convert input.png -colorspace hsl json:

输出实际上是在 HSL 中,只是有点误导,标记为红色、绿色和蓝色。

您可以通过创建一个几乎是红色但有一点变化的图像来测试它,这样 IM 就无法将它编码为像这样的调色图像:

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"
  }
},

可能卖出为红色、绿色和蓝色,但实际上"Red"是接近的Hue为零,即红色,"Green" 实际上是 Saturation,你可以看到它完全饱和,"Blue" 是 Lightness 是中灰色。