Commit 8b48ba4a authored by Oleg Dzhimiev's avatar Oleg Dzhimiev
Browse files

tested only for (t,z,h,w,c) shapes

parent 0a742391
Loading
Loading
Loading
Loading
+69 −19
Original line number Diff line number Diff line
@@ -24,19 +24,52 @@ __copyright__ = "Copyright 2018, Elphel, Inc."
__license__   = "GPL-3.0+"
__email__     = "oleg@elphel.com"

'''
Usage example:
  import imagej_tiffwriter
  import numpy as np

  # have a few images in the form of numpy arrays
  # make sure to stack them as:
  #   - (t,z,h,w,c)
  #   - (z,h,w,c)
  #   - (h,w,c)
  #   - (h,w)

  imagej_tiffwriter.save(path,images)

'''

from PIL import Image, TiffImagePlugin
import numpy as np
import math

# DO NOT USE?
# thing is the old ImageJs <1.52d poorly handle tags directories or something like that
def __get_IJ_IFD(t,z,c):

  ifd = TiffImagePlugin.ImageFileDirectory_v2()

  ijheader = [
    'ImageJ=',
    'hyperstack=true',
    'images='+str(t*z*c),
    'channels='+str(c),
    'slices='+str(z),
    'frames='+str(t),
    'loop=false'
  ]

  ifd[270] = ("\n".join(ijheader)+"\n")

  #is_hyperstack = 'true' if len(shape)>1 else 'false'
  #if (len(shape)>0):

  return ifd


def save(path,images,force_stack=False,force_hyperstack=False):
#def save(path,images,force_stack=False,force_hyperstack=False):
def save(path,images):

  # Got images, analyze shape:
  #   - possible formats (c == depth):
@@ -45,21 +78,37 @@ def save(path,images,force_stack=False,force_hyperstack=False):
  #     -- (h,w,c)
  #     -- (h,w)

  # save single layer image

  # 0 or 1 images.shapes are not handled
  #
  # save single channel image in the form of numpy array
  #   -
  if   len(images.shape)==2:
    # (h,w) -> (h,w,c=1)
    images = images[:,:,np.newaxis]
    image = Image.fromarray(images)
    image.save(path)

  elif len(images.shape)>2:
    # do nothing
    pass
  else:
    # (w,) -> (h=1,w,c=1)
    images = images[np.newaxis,:,np.newaxis]

  #imlist = np.ravel(Image.fromarray(images))
  t,z,h,w,c  = images.shape
    h,w,c  = images.shape[-3:]

    if len(images.shape)==3:
      images = np.reshape(images,(1,h,w,c))

    z = images.shape[-4]

    if len(images.shape)==4:
      images = np.reshape(images,(1,z,h,w,c))

    t  = images.shape[-5]

    c_axis = len(images.shape)-1

    if c>1:
      channels = np.squeeze(np.split(images,c,axis=c_axis))
    else:
      channels = np.squeeze(images,axis=c_axis)


    split_channels = np.concatenate(channels,axis=-3)
    images_flat = np.reshape(split_channels,(-1,h,w))
@@ -68,12 +117,13 @@ def save(path,images,force_stack=False,force_hyperstack=False):
    for i in range(images_flat.shape[0]):
      imlist.append(Image.fromarray(images_flat[i]))

  imlist[0].save(path,save_all=True,append_images=imlist[1:],tiffinfo=__get_IJ_IFD(t,z,c))
    imlist[0].save(path,save_all=True,append_images=imlist[1:])
    # thing is the old ImageJs <1.52d poorly handle tags directories or something like that
    #imlist[0].save(path,save_all=True,append_images=imlist[1:],tiffinfo=__get_IJ_IFD(t,z,c))

# Testing
if __name__ == "__main__":


  def hamming_window(x,N):
    y = 0.54 - 0.46*math.cos(2*math.pi*x/(N-1))
    return y