ImageMagick 命令缓慢问题

ImageMagick command slowness issue

我在我的 Web 应用程序中使用 ImageMagick 进行一些图像处理(使用 Java 作为 Ubuntu OS 中的后端),以从图像中识别 CMYK 颜色。

原图:

整个图像的过程如下:

首先,我将四张 CMYK 灰度图像分开:

convert IMG_1732.jpg -colorspace CMYK -negate -separate IMG_1732-sep.jpg

四张图片的结果如下:

图 1 :

图2:

图 3 :

图 4 :

然后我执行以下命令将每个灰度图像转换为 C、M、Y、K 彩色图像:

convert IMG_1732-sep-0.jpg -channel C -combine IMG_1732-sep-00.jpg

结果一:

convert IMG_1732-sep-1.jpg -channel M -combine IMG_1732-sep-11.jpg

结果二:

convert IMG_1732-sep-2.jpg -channel Y -combine IMG_1732-sep-22.jpg

结果 3:

convert IMG_1732-sep-3.jpg -channel K -combine IMG_1732-sep-33.jpg

结果 4:

问题是,它花费了太多时间,图像大小超过 2-3 MB。此外,还消耗更多 RAM 和 CPU。

我同意 Mark Setchell 的观点。你的问题不是很清楚。

如果您想为 RGB 输入中的任何像素找到等效的 CMYK 颜色,则可以执行以下操作,例如,对于像素 (10,10)。这里我使用了 ImageMagick 专用的 rose: image。但是你可以用任何真实的图像 (image.suffix) 来代替 rose:。对于真实图像,不包括最后的冒号。

convert rose: -colorspace CMYK -format "%[pixel:u.p{10,10}]\n" info:

cmyk(0,28,53,183)


如果您希望整个图像或其中的任何部分显示 CMYK 值,请使用 txt: output。例如,这是玫瑰的左上角 2x2 部分:image.

convert rose:[2x2+0+0] -colorspace CMYK txt:

# ImageMagick pixel enumeration: 2,2,65535,cmyk
0,0: (0,1365,4096,53199)  #000510CF  cmyk(0,5,16,207)
1,0: (0,2621,5243,52685)  #000A14CD  cmyk(0,10,20,205)
0,1: (0,1394,4183,53456)  #000510D0  cmyk(0,5,16,208)
1,1: (0,1365,4096,53199)  #000510CF  cmyk(0,5,16,207)

如果您尝试将每个 C、M、Y、K 通道分离为单独的图像,那么您的第一个命令就是这样做的:

convert IMG_1732.jpg -colorspace CMYK -negate -separate IMG_1732-sep.jpg


每个结果图像,IMG_1732-sep-0.jpg,IMG_1732-sep-1.jpg,IMG_1732-sep-2.jpg,IMG_1732-sep-3.jpg代表对应的否定(反转)C、M、Y、K 通道。无需任何进一步处理。 ImageMagick identify 会说它们是灰度,但值表示每个图像的反转 C、M、Y、K。

请注意,任何单通道图像在 ImageMagick 6 中将显示为 3 个相同的通道。在 ImageMagick 7 中,然后是单个灰度通道。

另请注意,-combine 需要 3 或 4 个输入图像才能重新组合回 RGB 或 CMYK。所以我不确定你的其他命令试图做什么。

我不太确定,但做了一些工作并想分享一下。我,或者我的一个 Whosebug 伙伴,当我们理解得更好时,可能会想出更好的东西,所以我会展示我目前所拥有的东西。

速度慢可能是因为必须启动 5 个进程并且必须读入 JPEG 图像并解码它们 5 次,所以我想使用一个进程并一次性完成。

这是我的:

convert image.jpg -colorspace cmyk -separate -write MPR:orig                                             \
   +delete -colorspace gray -threshold 101% -write MPR:blackx3 -delete 0,1,2                             \
   \( MPR:orig -delete 1,2,3 MPR:blackx3           -set colorspace CMYK -combine -write C.jpg +delete \) \
   \( MPR:orig -delete 0,2,3 MPR:blackx3 -swap 0,1 -set colorspace CMYK -combine -write M.jpg +delete \) \
   \( MPR:orig -delete 0,1,3 MPR:blackx3 -swap 0,2 -set colorspace CMYK -combine -write Y.jpg +delete \) \
      MPR:orig -delete 0,1,2 K.jpg

我敢肯定这有点令人生畏,所以我会一次解释每一行...

第 1 行: 加载原始图像,转换为 CMYK 色彩空间并分成 4 个独立的图像,一张带有 C,一张带有 M,一张带有 Y,一张带有 K。将所有 4 张图像保存在一块名为 "orig".

的 RAM 中

第2行:删除堆栈中的最后一个通道,即K,留下C、M和Y。将这3张图像全黑并一次性保存名为 "blackx3" 的内存,所以我有三个空的黑色通道供以后使用。

第3行:从RAM中重新加载CMYK,删除MYK,留下C,然后加载3个空的黑色通道。现在我们的堆栈中有 C, Black, Black, Black。告诉 IM 我们堆栈中的 4 个图像是 CMYK 通道并将它们组合并写为 "C.jpg"。清理。

第4行:从RAM中重新加载CMYK,删除CYK,留下M,然后加载3个空的黑色通道。现在我们的堆栈中有 M、Black、Black、Black。交换顺序为黑色、M、黑色、黑色。告诉 IM 我们堆栈中的 4 个图像是 CMYK 通道并将它们组合并写为 "M.jpg"。清理。

第5行:从RAM中重新加载CMYK,删除CMK,留下Y,然后加载3个空的黑色通道。现在我们的堆栈中有 Y, Black, Black, Black。交换顺序为黑色、黑色、Y、黑色。告诉 IM 我们堆栈中的 4 个图像是 CMYK 通道并将它们合并并写为 "Y.jpg"。清理。

第 6 行: 从 RAM 加载 CMYK。删除 CMY,留下黑色,另存为 "K.jpg".

这给出了这个:

如果您的数字 4 是与 CMYK 分开的通道,则不可能有彩色图像。所有单个通道都是灰度的。我也无法重现您的确切颜色。所以要么图像不同或发生变化,要么您没有告诉我们您所有的处理步骤。

类似于 Mark Setchell 的命令,我可以在一个命令行中编写您的命令,并获得大约 0.63 秒的处理时间。

time convert image.jpg -colorspace cmyk -negate -separate \
\( -clone 0 -channel C -combine +write C.jpg \) \
\( -clone 1 -channel M -combine +write M.jpg \) \
\( -clone 2 -channel Y -combine +write Y.jpg \) \
\( -clone 3 -channel K -combine +write K.jpg \) \
null:

0.626s


C.jpg

M.jpg

Y.jpg

K.jpg

如果您想要较小的文件大小,请在 +write 之前的每个括号中的命令中添加 -quality XX。或者找一些 JPG 优化器工具来 post 处理每个生成的图像。 Imagemagick 使用 libjpeg,它可能不是最高效的压缩器。我检查过你的输入和我所有的输出结果都使用 -quality 95.

如果我包含 -normalize 以增加对比度,我可以更接近您的结果,但处理时间会增加到大约 0.83 秒。

convert image.jpg -colorspace cmyk -negate -separate -normalize \
\( -clone 0 -channel C -combine +write C.jpg \) \
\( -clone 1 -channel M -combine +write M.jpg \) \
\( -clone 2 -channel Y -combine +write Y.jpg \) \
\( -clone 3 -channel K -combine +write K.jpg \) \
null:

我如何知道原始图像中可用的青色百分比?与洋红色、黄色和黑色相同?

convert image.jpg -colorspace CMYK -format "%[fx:mean.c], %[fx:mean.m], %[fx:mean.y], %[fx:mean.k]\n" info: 

输出: 0.0606194、0.0598201、0.0300933、0.0748128

这些值是 0 到 1 范围内的分数。对于百分比,将每个平均值乘以 100。请注意末尾需要冒号。