Извлеките плитки из мозаичного TIFF и сохраните в массиве numpy

Моя общая цель состоит в том, чтобы обрезать несколько областей из входного изображения слайда mirax (.mrxs) в выходные файлы JPEG.

Вот как выглядит одно из этих изображений:

введите здесь описание изображения

Обратите внимание, что более темная серая область является частью изображения, а области, которые я в конечном итоге хочу извлечь в формате JPEG, представляют собой 3 области черного квадрата.

Теперь о специфике:

Я могу извлечь цветовые каналы из изображения mirax в 3 отдельных файла TIFF, используя vips в командной строке:

vips extract_band INPUT.mrxs OUTPUT.tiff[tile,compression=jpeg] C --n 1

Где C соответствует номеру канала (0-2), а размер каждого выходного файла составляет около 250 МБ.

Следующая задача — каким-то образом распознать и извлечь интересующие области из изображений, поэтому я обратился к нескольким библиотекам изображений Python, и здесь я столкнулся с трудностями.

Когда я пытаюсь загрузить любой из TIFF с помощью OpenCV, используя:

i = cv2.imread('/home/user/input_img.tiff',cv2.IMREAD_ANYDEPTH) 

Я получаю сообщение об ошибке error: (-211) The total matrix size does not fit to "size_t" type in function setSize

Мне удалось добиться большего успеха с Pillow, выполнив следующие действия:

from PIL import Image
tiff = Image.open('/home/user/input_img.tiff')
print len(tiff.tile)
print tiff.tile[0]
print tiff.info

который выводит:

636633
('jpeg', (0, 0, 128, 128), 8, ('L', ''))
{'compression': 'jpeg', 'dpi': (25.4, 25.4)}

Однако, помимо загрузки изображения, я не могу выполнять никаких полезных операций; например, выполнение tiff.tostring() приводит к MemoryError (я делаю это, пытаясь преобразовать объект PIL в массив numpy). Я не уверен, что эта операция даже действительна, учитывая существование плиток.

По моему ограниченному пониманию, эти файлы TIFF хранят данные изображения в виде «плиток» (из которых приведенное выше изображение содержит 636633) в сжатом формате JPEG.

Однако мне не ясно, как можно было бы извлечь эти фрагменты для использования в качестве обычных изображений JPEG, или даже является ли описанная выше последовательность шагов процесса потенциально полезным способом достижения общей цели извлечения ROI из образ миракса.

Если я на правильном пути, то буду признателен за некоторые рекомендации, или, если есть другой способ достичь моей цели, используя vips/openslide без python, мне было бы интересно услышать идеи. Кроме того, дополнительная информация о том, как я могу работать с описанными мной файлами TIFF или понимать их, также будет полезна.

Идеальные ситуации включают в себя:

1) Какая-то функция автообрезки в vips/openslide, которая может генерировать JPEG из TIFF или оригинального изображения mirax, в соответствии с тем, что делает следующая команда, но без создания десятков тысяч изображений:

vips dzsave CMU-1.mrxs[autocrop] pyramid

2) Возможность извлекать фрагменты из TIFF и сохранять данные, соответствующие области изображения, в виде массива numpy, чтобы обнаружить 3 ROI с помощью OpenCV или другого метода.


person Ryan    schedule 01.05.2015    source источник


Ответы (1)


Я бы использовал випы Привязка Python очень похожа на PIL, но может обрабатывать эти огромные изображения. Попробуйте что-то вроде:

from gi.repository import Vips

slide = Vips.Image.new_from_file(sys.argv[1])
tile = slide.extract_area(left, top, width, height)
tile.write_to_file(sys.argv[2])

Конечно, вы также можете извлечь области из командной строки:

$ vips extract_area INPUT.mrxs OUTPUT.tiff left top width height

Хотя это будет немного медленнее, чем цикл в Python. Вы можете использовать crop как синоним extract_area.

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

$ vipsheader -a myslide.mrxs 

И посмотрите на вывод. Возможно, вы сможете рассчитать положение ваших субизображений из этого. Я также хотел бы спросить в списке рассылки openslide, они очень опытны и очень полезны.

Еще одна вещь, которую вы можете попробовать: получить обзор в низком разрешении, определить углы, а затем извлечь плитки из изображения в высоком разрешении. Чтобы получить версию слайда с низким разрешением, попробуйте:

$ vips copy myslide.mrxs[level=7] overview.tif

Уровень 7 понижен на 2**7, так что 128x.

person jcupitt    schedule 01.05.2015
comment
Это было полезно; используя это, я смог получить интересующую область. К сожалению, на практике я не всегда знал бы координаты. Я полагаю, что мог бы связать код vips-python с обнаружением углов OpenCV и таким образом получить значения «слева, сверху, ширины, высоты». Или вы знаете более простой способ? - person Ryan; 02.05.2015
comment
Я добавил примечание о метаданных слайда, это может помочь. - person jcupitt; 02.05.2015
comment
Также добавлено примечание о понижении частоты дискретизации во время загрузки, это очевидный способ сделать обнаружение углов полезным. - person jcupitt; 02.05.2015