Проблема с медлительностью команды ImageMagick

2

Я использую ImageMagick для некоторой обработки изображений в своем веб-приложении (используя Java в качестве backend в ОС Ubuntu), чтобы идентифицировать цвета CMYK из изображений.

Orginial Изображение:

Изображение 174551

Процедура выглядит так:

Во-первых, я разделяю четыре изображения в оттенках серого CMYK:

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

Результат четырех изображений, как показано ниже:

Изображение 1:

Изображение 174551

Изображение 2:

Изображение 174551

Изображение 3:

Изображение 174551

Изображение 4:

Изображение 174551

Затем я выполняю команды ниже для преобразования каждого из оттенков серого в цветное изображение C, M, Y, K:

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

Результат 1:

Изображение 174551

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

Результат 2:

Изображение 174551

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

Результат 3:

Изображение 174551

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

Результат 4:

Изображение 174551

Проблема в том, что занимает слишком много времени, размер изображения составляет более 2-3 МБ. Кроме того, потребляет больше оперативной памяти и процессора.

  • Как я могу его оптимизировать? Есть ли другой вариант в ImageMagick или каким-либо другим способом?
  • Как я могу узнать процент CYAN, доступный в исходном изображении? Такие же, как пурпурный, желтый и черный? Является ли это возможным?
  • 0
    Я понимаю, что первая команда преобразует изображение в CMYK, инвертирует каналы и разделяет их на 4 отдельных файла JPG. Я понятия не имею, что пытаются сделать следующие 4 команды? Вы говорите, что хотите «найти CMYK в каждом», но что это значит? В отдельном файле, содержащем C., не будет MY или K. Каков будет ответ на ваш вопрос - ожидаете ли вы изображение чего-либо? четыре отдельных изображения чего-то? средства некоторых изображений? Это очень непонятно для меня!
Теги:
image-processing
imagemagick

3 ответа

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 Изображение 174551

M.jpg Изображение 174551

Y.jpg Изображение 174551

K.jpg Изображение 174551

Если вы хотите уменьшить размер файла, добавьте -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:

Изображение 174551

Изображение 174551

Изображение 174551

Изображение 174551

Как я могу узнать процент 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. Просьба отметить, что двоеточие в конце необходимо.

  • 0
    Круто - так лучше. Я знал, что я не думал прямо :-)
  • 0
    Есть ли способ узнать процентное содержание C, M, Y, K в сгенерированных четырех изображениях?
Показать ещё 4 комментария
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 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".

Это дает следующее:

Изображение 174551 Изображение 174551

Изображение 174551 Изображение 174551

  • 0
    Спасибо Марк, это улучшает производительность. Однако K.jpg дает вывод и с другими цветами. Другие тройки верны
  • 0
    Я добавил результаты, которые я получаю. На мой взгляд, они выглядят как правильные цветоделения для этого входного изображения - хотя я не эксперт по технологии печати. Может быть, вы можете нажать edit под вашим вопросом и вставить что-нибудь другое. Кроме того, на какой версии ImageMagick вы находитесь? Я использую v7.0.8.
Показать ещё 1 комментарий
1

Я согласен с Марком Сетчеллом. Ваш вопрос не очень ясен.

Если вы хотите найти эквивалент цвета 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. Поэтому я не уверен, что ваши другие команды пытаются сделать.

  • 0
    Обновленный вопрос. пожалуйста, проверьте

Ещё вопросы

Сообщество Overcoder
Наверх
Меню