Сплит многостраничный tiff с python
каков наилучший способ разделить многостраничный TIFF с python? PIL, похоже, не поддерживает многостраничные изображения, и я не нашел точный порт для libtiff для python. Будет ли PyLibTiff путь идти? Может ли кто-нибудь привести простой пример того, как я могу анализировать несколько страниц в TIFF?
5 ответов
Я использую ImageMagick в качестве внешней программы для преобразования многостраничного факса в видимые PNGs:
/usr/bin/convert /var/voip/fax/out/2012/04/fax_out_L1_17.tiff[0] -scale 50x100% -depth 16 /tmp/fax_images/fax_out_L1_17-0-m.png
преобразует первую страницу в PNG
aaa.tiff[1] будет второй страницей и так далее.
или для извлечения всех изображений, сделать:
convert -verbose fax_in_L1-1333564876.469.tiff a.png
fax_in_L1-1333564876.469.tiff[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.030u 0:00.030
fax_in_L1-1333564876.469.tiff[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010
fax_in_L1-1333564876.469.tiff[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 109KiB 0.020u 0:00.010
fax_in_L1-1333564876.469.tiff=>a-0.png[0] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 12KiB 0.030u 0:00.019
fax_in_L1-1333564876.469.tiff=>a-1.png[1] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 8KiB 0.040u 0:00.039
fax_in_L1-1333564876.469.tiff=>a-2.png[2] TIFF 1728x1078 1728x1078+0+0 1-bit Bilevel DirectClass 32KiB 0.070u 0:00.070
Итак, чтобы просто разделить один многостраничный TIFF на многостраничный TIFF, вам нужно будет выполнить:
convert in-12345.tiff /tmp/out-12345.tiff
а затем работать с временными файлами: / tmp / out-12345-*.Тифф
Однако ImageMagick можно сделать много обработки, так что вы можете достичь желаемого результата в одной команде.
проект (раскрытие: который я один из главных авторов, этот вопрос был одним из вещей, которые побудили меня работать над ним), который делает это легко, это PIMS. Ядро PIMS по существу является очищенной и обобщенной версией следующего класса.
класс для извлечения базового кадра + простая итерация.
import PIL.Image
class Stack_wrapper(object):
def __init__(self,fname):
'''fname is the full path '''
self.im = PIL.Image.open(fname)
self.im.seek(0)
# get image dimensions from the meta data the order is flipped
# due to row major v col major ordering in tiffs and numpy
self.im_sz = [self.im.tag[0x101][0],
self.im.tag[0x100][0]]
self.cur = self.im.tell()
def get_frame(self,j):
'''Extracts the jth frame from the image sequence.
if the frame does not exist return None'''
try:
self.im.seek(j)
except EOFError:
return None
self.cur = self.im.tell()
return np.reshape(self.im.getdata(),self.im_sz)
def __iter__(self):
self.im.seek(0)
self.old = self.cur
self.cur = self.im.tell()
return self
def next(self):
try:
self.im.seek(self.cur)
self.cur = self.im.tell()+1
except EOFError:
self.im.seek(self.old)
self.cur = self.im.tell()
raise StopIteration
return np.reshape(self.im.getdata(),self.im_sz)
Imagemagick работал на меня очень хорошо. Wnen разделение файла tiff, в основном преобразование из tiff в tiff, можно использовать флаг для принудительного сохранения выходных файлов в отдельные файлы tiff. Чтобы сделать это, попробуйте
convert input.tif output-%d.tif
оператор %d-это стиль c-Printf %d. Итак, если вам нужна последовательность запуска 3 полей, вы можете сказать
convert input.tif output-%3d.tif
и так далее.. %d заменяется номером "сцены" изображения. Теперь номера сцен могут или не всегда начинаться с 0 (или 1, Если вы этого хотите путь.) Чтобы настроить последовательность так, как вы хотите, попробуйте
convert input.tif -scene 1 output-%3d.tif
это запустит последовательность прямо из подсчета, который вы предоставили.
convert -scene 1 input.TIF output-%d.TIF
output-1.TIF
output-2.TIF
output-3.TIF
магия в самом деле!! :)
этой ссылке к документации имеет больше деталей. Это работает и на моей машине windows.
следующее разбивает файл tif с несколькими кадрами на файлы tif, где каждый файл является одним кадром.
def parse_tif(filePath):
img = Image.open(filePath)
for i in range (numFramesPerTif):
try:
img.seek(i)
img.save('Block_%s.tif'%(i,))
except EOFError: #end of file error