ImageMagick命令缓慢问题

时间:2018-08-29 06:16:53

标签: java linux ubuntu image-processing imagemagick

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

原始图片:

enter image description here

整个图像的步骤如下:

首先,我将以CMYK的灰度分离四个图像:

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

四个图像的结果如下:

图片1:

enter image description here

图片2:

enter image description here

图片3:

enter image description here

图片4:

enter image description here

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

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

结果1:

enter image description here

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

结果2:

enter image description here

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

结果3:

enter image description here

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

结果4:

enter image description here

问题是,这花费了太多时间,图像大小约为2-3 MB。另外,还要消耗更多的RAM和CPU。

  • 如何优化它? ImageMagick中还有其他选择吗? 还有其他方式吗?
  • 我如何知道原始图像中可用的CYAN百分比?与洋红色,黄色和黑色相同吗?有可能吗?

3 个答案:

答案 0 :(得分:3)

我不确定,但是已经做了一些工作并希望与大家分享。我或我的StackOverflow好友之一可能会在我们了解得更多之后提出更好的建议,所以我将展示到目前为止的经验。

缓慢可能是由于必须启动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张图片全部变黑,并保存在名为{{ 1}},所以我有三个空的黑色通道供以后使用。

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

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

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

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

这给出了这一点:

enter image description here enter image description here

enter image description here enter image description here

答案 1 :(得分:3)

如果您的数字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 enter image description here

M.jpg enter image description here

Y.jpg enter image description here

K.jpg enter image description here

如果要减小文件大小,请在+ write之前在括号中的每个命令中添加-quality XX。或者找到一些JPG优化器工具来后期处理每个生成的图像。 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:

enter image description here

enter image description here

enter image description here

enter image description here

我怎么知道原始图像中可用的CYAN百分比?和洋红色,黄色和黑色一样?

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。请注意,最后需要冒号。

答案 2 :(得分:1)

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

如果要查找RGB输入中任何像素的CMYK颜色等效项,则可以对像素(10,10)执行以下操作。在这里,我使用ImageMagick特殊的rose:图像。但是您可以将任何真实图像(image.suffix)替换为rose:。对于真实图像,请不要包含最后的冒号。

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

cmyk(0,28,53,183)


如果要使整个图像或图像的任何部分显示CMYK值,请使用txt:输出。例如,这是玫瑰的左上2x2部分:图像。

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识别器会说它们是灰度的,但是这些值代表每个图像的C,M,Y,K倒置。

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

还要注意,-combine需要3或4个输入图像才能重新组合回RGB或CMYK。因此,我不确定您的其他命令正在尝试做什么。