Как изменить размер изображения с несколькими каналами? - PullRequest
1 голос
/ 03 мая 2019

У меня есть изображение tiff размером 21 X 513 X 513, где (513, 513) - высота и ширина изображения, содержащего 21 канал. Как я могу изменить размер этого изображения до 21 X 500 X 375?

Я пытаюсь использовать ПОДУШКУ для этого. Но не могу понять, делаю ли я что-то не так.

>>> from PIL import Image
>>> from tifffile import imread
>>> img = Image.open('new.tif')
>>> img

    <PIL.TiffImagePlugin.TiffImageFile image mode=F size=513x513 at 0x7FB0C8E5B940>

>>> resized_img = img.resize((500, 375), Image.ANTIALIAS)
>>> resized_img

    <PIL.Image.Image image mode=F size=500x375 at 0x7FB0C8E5B908>

>>> resized_img.save('temp.tif')

>>> img = imread('temp.tif')
>>> img.shape
  (500, 375)

Информация о канале теряется здесь.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Попробуйте использовать tifffile и scikit-image:

from tifffile import imread, imwrite
from skimage.transform import resize

data = imread('2009_003961_SEG.tif')
resized_data = resize(data, (375, 500, 21))
imwrite('multi-channel_resized.tif', resized_data, planarconfig='CONTIG')

Файл 2009_003961_SEG.tif, связанный в comment98601187_55975161 , не является многоканальным изображением 513x513x21.Вместо этого файл содержит 513 изображений размером 513x21.Библиотека tifffile будет считывать серии изображений в файле и возвращать их в виде массива с цифрами 513x513x21.

Чтобы изменить размер массива с цифрами 375x500x21, используйте skimage.transform.resize (или scipy.ndimage.zoom).Возможно, будет быстрее изменить размер 21 канала отдельно.

Чтобы записать файл TIFF, содержащий одноканальное изображение размером 375x500x21, с использованием tifffile, укажите параметр planarconfig.Не многие библиотеки или приложения могут обрабатывать такие файлы.

0 голосов
/ 03 мая 2019

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

import cv2

file = "image.tiff"
img = cv2.imread(file)
print("original image size: ", img.shape)

new_img = cv2.resize(img,(img.shape[1]-100,img.shape[0]-100))  # cv2.resize(image,(width,height))
print("resized image size: ", new_img.shape)

Выход:
оригинальный размер изображения: (512, 768, 3)
измененный размер изображения: (412, 668, 3)

Opencv принимает INTER_LINEAR в качестве метода интерполяции по умолчанию.

Вы можете изменить интерполяцию, указав дополнительный аргумент

new_img = cv2.resize(img,(img.shape[1]-100,img.shape[0]-100),interpolation=cv2.INTER_AREA)

Подробнее о доступном методе интерполяции здесь: https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=resize#resize

...