Проблема с медлительностью команды ImageMagick - PullRequest
0 голосов
/ 29 августа 2018

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

Оригинальное изображение:

enter image description here

Процедура, как показано ниже для всего изображения:

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

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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

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

Результат 1:

enter image description here

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

Результат 2:

enter image description here

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

Результат 3:

enter image description here* * 1085

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

Результат 4:

enter image description here

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

  • Как я могу его оптимизировать? Есть ли другой вариант в ImageMagick или любым другим способом?
  • Как узнать процентное содержание CYAN в исходном изображении? Так же, как пурпурный, желтый и черный? Возможно ли это?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Я не уверен в этом, но проделал некоторую работу и хотел поделиться ею. Я или один из моих друзей из 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".

Строка 2: Удалите последний канал в стеке, который был K, оставив C, M и Y. Сделайте все эти 3 изображения полностью черными и сохраните их в памяти с именем "blackx3" поэтому у меня есть три пустых чёрных канала на потом.

Строка 3: Перезагрузите CMYK из ОЗУ, удалите MYK, оставив C, затем загрузите 3 пустых черных канала. Теперь у нас в стеке C, Black, Black, Black. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK, и объедините их и напишите как "C.jpg". Убери.

Строка 4: Перезагрузите CMYK из ОЗУ, удалите CYK, оставив M, затем загрузите 3 пустых черных канала. Теперь у нас в стеке M, Black, Black, Black. Поменять порядок на Черный, М, Черный, Черный. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK, и объедините их и напишите как "M.jpg". Убери.

Строка 5: Перезагрузите CMYK из ОЗУ, удалите CMK, оставив Y, затем загрузите 3 пустых черных канала. Теперь в нашем стеке есть Y, Black, Black, Black. Поменяйте порядок на Черный, Черный, Y, Черный. Скажите IM, что 4 изображения в нашем стеке являются каналами CMYK, и объедините их и напишите как "Y.jpg". Убери.

Строка 6: Загрузить CMYK из ОЗУ. Удалить CMY, оставив черный, сохранить как "K.jpg".

Это дает:

enter image description here enter image description here

enter image description here enter image description here

0 голосов
/ 30 августа 2018

Невозможно иметь цветное изображение для вашего номера 4, если это был канал, отделенный от CMYK. Все отдельные каналы будут в оттенках серого. Также я не могу воспроизвести ваши точные цвета. Таким образом, либо изображение изменилось, либо изменилось, либо вы не сообщили нам все свои этапы обработки.

Подобно команде Марка Сетчелла, я могу написать вашу команду в одной командной строке и получить время обработки около 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 enter image description here

M.jpg enter image description here

Y.jpg enter image description here

K.jpg enter image description here

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

enter image description here

enter image description here

enter image description here

enter image description here

Как узнать процентное содержание 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 голосов
/ 29 августа 2018

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

Если вы хотите найти эквивалент цвета CMYK для любого пикселя на входе RGB, то вы можете сделать следующее, например, для пикселя (10,10). Здесь я использую особую розу ImageMagick: 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 скажет, что они в оттенках серого, но значения представляют инвертированные C, M, Y, K для каждого изображения.

Обратите внимание, что любое одноканальное изображение будет отображаться в ImageMagick 6 как 3 идентичных канала. В ImageMagick 7 используются одиночные каналы в градациях серого.

Также обратите внимание, что -combine потребуется 3 или 4 входных изображения для повторной рекомбинации обратно в RGB или CMYK. Поэтому я не уверен, что другие ваши команды пытаются сделать.

...