【问题标题】:ImageMagick command slowness issueImageMagick 命令缓慢问题
【发布时间】:2019-02-03 20:11:07
【问题描述】:

我在我的 Web 应用程序中使用 ImageMagick 进行一些图像处理(在 Ubuntu OS 中使用 Java 作为后端),以从图像中识别 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

结果 1:

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

结果 2:

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 中是否还有其他选项或 还有其他方法吗?
  • 我如何知道原始图像中可用的青色百分比?与洋红色、黄色和黑色相同?有可能吗?

【问题讨论】:

  • 我知道第一个命令将图像转换为 CMYK,反转通道并将它们分成 4 个单独的 JPG 文件。我不知道接下来的 4 个命令要做什么?您说您想“在每个中找到 CMYK”,但这是什么意思?包含 C 的单独文件中不会有 MY 或 K。您的问题的答案是什么 - 您期望某物的图像吗?四个不同的图像?一些图像的手段?我很不清楚!

标签: java linux ubuntu image-processing imagemagick


【解决方案1】:

如果您的数字 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 优化工具来后期处理每个生成的图像。 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。请注意末尾的冒号是必需的。

【讨论】:

  • 酷 - 更好。我知道我的想法不正确:-)
  • 有什么方法可以找出生成的四张图片中C、M、Y、K的百分比吗?
  • 您可以通过convert C.jpg -format "%[fx:100*mean] info: 获得图像的平均值。或者来自您的原始图像convert input.jpg -colorspace CMYK -format "%[fx:mean.c], %[fx:mean.m], %[fx:mean.y], %[fx:mean.k]" info:。如果需要,您可以将 -negate 添加到命令中,以便结果与您的否定结果 C.jpg 等相匹配。
  • 我的意思是,我应该从任何图像中知道,原始图像中有多少百分比的CYAN?与洋红色、黄色和黑色相同?您的命令会生成一个新图像。
  • 该命令不应创建新图像。它只写信息: 。注意末尾的冒号是必需的。 convert logo: -colorspace CMYK -format "%[fx:mean.c], %[fx:mean.m], %[fx:mean.y], %[fx:mean.k]\n" info: 在带有 IM 6.9.10.11 Q16 的 Mac OSX Sierra 上仅返回 0.0606194, 0.0598201, 0.0300933, 0.0748128。这些值是 0 到 1 范围内的分数。如果您想要百分比,请将每个平均值乘以 100。您的确切 ImageMagick 版本和平台是什么?
【解决方案2】:

我不确定这一点,但我做了一些工作并想分享它。当我们理解得更好时,我或我的一个 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 个图像全黑并保存在名为 @987654331 的内存块中@所以我有三个空的黑色通道供以后使用。

第 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"

这给出了这个:

【讨论】:

  • 感谢 Mark,它确实提高了性能。但是K.jpg 也提供其他颜色的输出。其他三个是正确的
  • 我已经添加了我得到的结果。在我看来,它们看起来像是输入图像的正确分色——尽管我不是打印技术方面的专家。也许您可以在您的问题下单击edit 并粘贴任何不同的内容。另外,您使用的是哪个版本的 ImageMagick?我正在使用 v7.0.8。
  • 是的,您的图片是正确的。我正在使用 ImageMagick 6.7.7-10
【解决方案3】:

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

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

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

cmyk(0,28,53,183)


如果您希望整个图像或其任何部分显示 CMYK 值,请使用 txt: output。例如,这是玫瑰左上角的 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。所以我不确定你的其他命令在做什么。

【讨论】:

  • 更新问题。请检查
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2021-06-04
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多