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。
- 如何优化它? ImageMagick 中是否还有其他选项或
还有其他方法吗?
- 我如何知道原始图像中可用的青色百分比?与洋红色、黄色和黑色相同吗?可能吗?
我同意 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。请注意末尾需要冒号。
我在我的 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。
- 如何优化它? ImageMagick 中是否还有其他选项或 还有其他方法吗?
- 我如何知道原始图像中可用的青色百分比?与洋红色、黄色和黑色相同吗?可能吗?
我同意 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"
.
第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。请注意末尾需要冒号。