Я использую ImageMagick
для некоторой обработки изображений в своем веб-приложении (используя Java в качестве backend в ОС Ubuntu), чтобы идентифицировать цвета CMYK
из изображений.
Orginial Изображение:
Процедура выглядит так:
Во-первых, я разделяю четыре изображения в оттенках серого 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 МБ. Кроме того, потребляет больше оперативной памяти и процессора.
ImageMagick
или каким-либо другим способом?Невозможно иметь цветное изображение для вашего номера 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
Если вы хотите уменьшить размер файла, добавьте -quality XX к каждой из команд в скобках перед +write. Или найдите некоторый инструмент оптимизатора 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. Просьба отметить, что двоеточие в конце необходимо.
Я не уверен в этом, но проделал определенную работу и хотел поделиться ею. Я, или один из моих друзей 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 colourspace и разделите на 4 отдельных изображения, один с C, один с M, один с Y и один с K. Сохраните все 4 из этих изображений в кучке ОЗУ под названием "orig"
,
Строка 2: Удалить последний канал в стеке, который был K, оставив C, M и Y. Сделайте все эти 3 изображения полностью черными и сохраните в "blackx3"
памяти с именем "blackx3"
чтобы у меня было три пустых черных канала для более поздних,
Строка 3: Перезагрузите CMYK из ОЗУ, удалите MYK, оставив C, затем загрузите 3 пустых черного канала. Теперь у нас есть C, Black, Black, Black. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK и объединяют их и записывают как "C.jpg"
. Очистите.
Строка 4: Перезагрузите CMYK из ОЗУ, удалите CYK, оставив M, затем загрузите 3 пустых черных канала. Теперь у нас есть M, Black, Black, Black. Заказ Swap на Black, M, Black, Black. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK и объединяют их и записывают как "M.jpg"
. Очистите.
Строка 5: Перезагрузите CMYK из ОЗУ, удалите CMK, оставив Y, затем загрузите 3 пустых черных канала. Теперь у нас есть Y, Black, Black, Black. Заказ Swap на черный, черный, Y, черный. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK и объединяют их и записывают как "Y.jpg"
. Очистите.
Строка 6: Загрузите CMYK из ОЗУ. Удалите CMY, оставив черный, сохраните как "K.jpg"
.
Это дает следующее:
K.jpg
дает вывод и с другими цветами. Другие тройки верны
edit
под вашим вопросом и вставить что-нибудь другое. Кроме того, на какой версии ImageMagick вы находитесь? Я использую v7.0.8.
Я согласен с Марком Сетчеллом. Ваш вопрос не очень ясен.
Если вы хотите найти эквивалент цвета CMYK для любого пикселя на входе RGB, вы можете сделать следующее, например, для пикселя (10,10). Здесь я использую специальное изображение ImageMagick: изображение. Но вместо роза вы можете поместить любой реальный образ (image.suffix). Для реальных изображений не включайте окончательный двоеточие.
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. Поэтому я не уверен, что ваши другие команды пытаются сделать.