Самая быстрая библиотека изображений Ubuntu для аннотирования

1

В настоящее время я работаю с изображениями и хотел бы узнать самую быструю библиотеку обработки изображений, относящуюся к аннотации. В настоящее время я использую эту команду:

convert orig.tif -background Red -density 300 -font /usr/share/fonts/truetype/msttcorefonts/Arial.ttf -pointsize 12 -gravity south -splice 0x150 -gravity southwest -annotate +50+50 "left corner" -gravity southeast -annotate +50+50 'right corner' +repage endorsed.tif  

Я вызываю это внутри метода subprocess.call в python. Если я делаю это в командной строке, я получаю около 1 секунды всего времени:

real    0m0.162s
user    0m0.940s
sys         0m0.030s

Моя программа в среднем составляет 1,96 секунды:

[**copied_from** avg] 0:00:00.071887
[**mysql** avg] 0:00:00.000265
[**cropped** avg] 0:00:00.433935
[**rm** avg] 0:00:00.007758
[**copied_to** avg] 0:00:00.147880
[**endorsed** avg] 0:00:01.963496
[**mssql** avg] 0:00:00.000010

Я не уверен, почему существует расхождение между вызовом из командной строки или через python subprocess.call(cmd, shell = True). В любом случае, оба они слишком медленные.

Я в основном обрезаю и аннотирую изображения. Кажется, что кадрирование достаточно быстро с конвертированием imagemagick, но аннотирование слишком медленное. Кто-нибудь знает о более быстрой библиотеке изображений? Мне удобно использовать python/ruby, но на данном этапе было бы полезно любое решение, которое будет быстрее.

Спасибо всем.

Теги:
image-processing
imagemagick

1 ответ

2

Вызов вещей из subprocess.call всегда будет иметь довольно много накладных расходов по сравнению с реальной оболочкой (например, bash).

Вы пытались использовать imagemagick python bindings вместо вызова через subprocess? (Изменить: Отменить это... Эти привязки устарели. Я не знаю ни одного лучшего, хотя... Я долго не использовал imagemagick через python...)

Вы также можете сделать это с помощью PIL, хотя это немного менее гибко и, вероятно, не значительно быстрее.

Что бы это ни стоило, здесь эквивалент вашей команды imagemagick с использованием PIL.

import Image
import ImageDraw
import ImageFont

rect_height = 150

im_orig = Image.open('orig.tif')
width, height = im_orig.size
im = Image.new('RGB', (width, height+rect_height))
im.paste(im_orig, (0,0))

width, height = im.size
dpi = 300
im.info['dpi'] = (dpi, dpi)
font_size = 12
font = ImageFont.truetype('/usr/share/fonts/truetype/arial.ttf', 
                         int(dpi * font_size / 72.0))

draw = ImageDraw.Draw(im)
draw.rectangle([(0,height-rect_height), (width, height)], fill='red')

text = 'left corner'
text_width, text_height = font.getsize(text)
draw.text((50, height - 50 - text_height), 
    text, fill='black', font=font)

text = 'right corner'
text_width, text_height = font.getsize(text)
draw.text((width - 50 - text_width, height - 50 - text_height), 
        text, fill='black', font=font)

im.save('output.tif')

Как вы можете видеть, это немного менее удобно, но он работает. Кроме того, это выглядит быстрее, чем imagemagick на моей машине. Вышеупомянутый script занимает ~ 0,43 секунды для довольно большого изображения, а ваша эквивалентная команда imagemagick (просто запускается непосредственно из оболочки) занимает ~ 1,1 сек. Конечно, imagemagick может делать намного больше, чем PIL, но для простой манипуляции изображениями на python PIL работает очень хорошо.

(Изменить: разница в скорости - это то, что PIL сохраняет входной файл tif (который сжат LZW) как несжатый tif, а imagemagick сохраняет его как сжатый TIF LZW, аналогичный входу.)

  • 0
    Джо, спасибо за быстрый ответ. Я еще не использовал PythonMagick. Я использовал RMagick, рубиновые крепления и обнаружил, что скорости были примерно одинаковыми.
  • 0
    Большое спасибо за понимание. Я собираюсь попробовать это в ПИЛ. Ты восхитителен.
Показать ещё 10 комментариев

Ещё вопросы

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