我在Web应用程序(使用Java作为Ubuntu OS的后端)中使用ImageMagick进行某些图像处理,以从图像中识别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。
答案 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"
。
这给出了这一点:
答案 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
如果要减小文件大小,请在+ 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:
我怎么知道原始图像中可用的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。因此,我不确定您的其他命令正在尝试做什么。