Моя общая цель состоит в том, чтобы обрезать несколько областей из входного изображения слайда 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 или другого метода.