Самая быстрая библиотека изображений Ubuntu для аннотирования - PullRequest
1 голос
/ 19 мая 2011

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

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

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

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

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

1 Ответ

2 голосов
/ 19 мая 2011

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

Вы пытались использовать привязки Python для imagemagick вместо вызова через 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 на моей машине.Приведенный выше сценарий занимает ~ 0,43 секунды для длинного изображения, в то время как ваша эквивалентная команда imagemagick (запускаемая непосредственно из оболочки) занимает ~ 1,1 секунды.Конечно, imagemagick может сделать на лот больше, чем PIL, но для простой манипуляции с изображениями в python PIL работает довольно хорошо.

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

...