Изменение размера трехмерного изображения (и повторная выборка)
У меня есть трехмерное изображение мозга (назовем его вспышкой), и в настоящее время оно составляет 263 x 256 x 185. Я хочу изменить его размер, чтобы он соответствовал размеру другого изображения (назовите его whole_brain_bravo); 256 x 256 x 176 и (будем надеяться) использовать интерполяцию Ланцоша для повторной выборки (Image.ANTIALIAS). Моя (неудачная) попытка:
from scipy import ndimage as nd
import nibabel as nib
import numpy as np
a = nib.load('flash.hdr') # nib is what I use to load the images
b = nib.load('whole_brain_bravo.hdr')
flash = a.get_data() # Access data as array (in this case memmap)
whole = b.get_data()
downed = nd.interpolation.zoom(flash, zoom=b.shape) # This obviously doesn't work
Ребята, вы когда-нибудь делали подобные вещи на 3D-изображении?
2 ответа
Из строки документации для scipy.ndimage.interpolate.zoom
:
"""
zoom : float or sequence, optional
The zoom factor along the axes. If a float, `zoom` is the same for each
axis. If a sequence, `zoom` should contain one value for each axis.
"""
Каков масштабный коэффициент между двумя изображениями? Она постоянна по всем осям (т.е. вы масштабируете изометрически)? В таком случае zoom
должно быть одно значение с плавающей точкой. В противном случае это должна быть последовательность поплавков, по одному на ось.
Например, если физические размеры whole
а также flash
можно считать равным, тогда вы могли бы сделать что-то вроде этого:
dsfactor = [w/float(f) for w,f in zip(whole.shape, flash.shape)]
downed = nd.interpolation.zoom(flash, zoom=dsfactor)
Согласно документам, zoom
Аргумент "Коэффициент масштабирования по осям". Это немного расплывчато, но звучит так, будто они означают масштабный коэффициент, а не желаемое измерение.
Попробуй это:
zoomFactors = [bi/float(ai) for ai, bi in zip(a, b)]
downed = nd.interpolation.zoom(flash, zoom=zoomFactors)
Не уверен насчет выбора фильтра - в документах упоминаются только сплайн-интерполяции разных порядков.