def _mergeTif(self, parts, outfilename): for i, tifname in enumerate(parts): tif = TiffIO.TiffIO(tifname, mode='rb') nImages = tif.getNumberOfImages() if i == 0: images = [tif.getData(j).copy() for j in range(nImages)] headers = [{ 'Title': tif.getInfo(j)['info']['Title'] } for j in range(nImages)] else: headersi = [{ 'Title': tif.getInfo(j)['info']['Title'] } for j in range(nImages)] for header, img in zip(headers, images): k = headersi.index(header) self._fillPartial(img, tif.getData(k)) del tif if os.path.exists(outfilename): _logger.debug("Output file already exists, trying to delete it") os.remove(outfilename) for i, (img, header) in enumerate(zip(images, headers)): # TODO: there must be a better way if i == 0: tifout = TiffIO.TiffIO(outfilename, mode="wb+") elif i == 1: del tifout tifout = TiffIO.TiffIO(outfilename, mode="rb+") tifout.writeImage(img, info=header) del tifout
def save3DArrayAsMonochromaticTiff(data, filename, labels=None, dtype=None, mcaindex=-1): ndata = data.shape[mcaindex] if dtype is None: dtype = numpy.float32 if os.path.exists(filename): try: os.remove(filename) except OSError: pass if labels is None: labels = [] for i in range(ndata): labels.append("Array_%d" % i) if len(labels) != ndata: raise ValueError("Incorrect number of labels") outfileInstance = TiffIO.TiffIO(filename, mode="wb+") if mcaindex in [2, -1]: for i in range(ndata): if i == 1: outfileInstance = TiffIO.TiffIO(filename, mode="rb+") if dtype is None: tmpData = data[:, :, i] else: tmpData = data[:, :, i].astype(dtype) outfileInstance.writeImage(tmpData, info={'Title': labels[i]}) if (ndata > 10): print("Saved image %d of %d" % (i + 1, ndata)) _logger.info("Saved image %d of %d", i + 1, ndata) elif mcaindex == 1: for i in range(ndata): if i == 1: outfileInstance = TiffIO.TiffIO(filename, mode="rb+") if dtype is None: tmpData = data[:, i, :] else: tmpData = data[:, i, :].astype(dtype) outfileInstance.writeImage(tmpData, info={'Title': labels[i]}) if (ndata > 10): _logger.info("Saved image %d of %d", i + 1, ndata) print("Saved image %d of %d" % (i + 1, ndata)) else: for i in range(ndata): if i == 1: outfileInstance = TiffIO.TiffIO(filename, mode="rb+") if dtype is None: tmpData = data[i] else: tmpData = data[i].astype(dtype) outfileInstance.writeImage(tmpData, info={'Title': labels[i]}) if (ndata > 10): _logger.info("Saved image %d of %d", i + 1, ndata) print("Saved image %d of %d" % (i + 1, ndata)) outfileInstance.close() # force file close
def test(): from PyMca5 import StackBase testFileName = "TiffTest.tif" nrows = 2000 ncols = 2000 #create a dummy stack with 100 images nImages = 100 imagestack = True a = numpy.ones((nrows, ncols), numpy.float32) if not os.path.exists(testFileName): print("Creating test filename %s" % testFileName) tif = TiffIO.TiffIO(testFileName, mode='wb+') for i in range(nImages): data = (a * i).astype(numpy.float32) if i == 1: tif = TiffIO.TiffIO(testFileName, mode='rb+') tif.writeImage(data, info={'Title': 'Image %d of %d' % (i + 1, nImages)}) tif = None stackData = TiffStack(imagestack=imagestack) stackData.loadFileList([testFileName], dynamic=True) if 0: stack = StackBase.StackBase() stack.setStack(stackData) print("This should be 0 = %f" % stack.calculateROIImages(0, 0)['ROI'].sum()) print("This should be %f = %f" %\ (a.sum(),stack.calculateROIImages(1, 2)['ROI'].sum())) if imagestack: print("%f should be = %f" %\ (stackData.data[0:10,:,:].sum(), stack.calculateROIImages(0, 10)['ROI'].sum())) print("Test small ROI 10 should be = %f" %\ stackData.data[10:11,[10],11].sum()) print("Test small ROI 40 should be = %f" %\ stackData.data[10:11,[10,12,14,16],11].sum()) else: print("%f should be = %f" %\ (stackData.data[:,:, 0:10].sum(), stack.calculateROIImages(0, 10)['ROI'].sum())) print("Test small ROI %f" %\ stackData.data[10:11,[29],:].sum()) else: from PyMca5.PyMca import PyMcaQt as qt from PyMca5.PyMca import QStackWidget app = qt.QApplication([]) w = QStackWidget.QStackWidget() print("Setting stack") w.setStack(stackData) w.show() app.exec_()
def save2DArrayListAsMonochromaticTiff(datalist, filename, labels=None, dtype=None): if type(datalist) != type([]): datalist = [datalist] ndata = len(datalist) if dtype is None: dtype = datalist[0].dtype for i in range(len(datalist)): dtypeI = datalist[i].dtype if dtypeI in [numpy.float32, numpy.float64] or\ dtypeI.str[-2] == 'f': dtype = numpy.float32 break elif dtypeI != dtype: dtype = numpy.float32 break if labels is None: labels = [] for i in range(ndata): labels.append("Array_%d" % i) if len(labels) != ndata: raise ValueError("Incorrect number of labels") multifile = False if type(filename) in [type([]), type((1, ))]: if len(filename) == 1: fileList = filename elif len(filename) != len(labels): raise ValueError("Incorrect number of files") else: fileList = filename multifile = True else: fileList = [filename] savedData = 0 while savedData < ndata: if multifile: fname = fileList[savedData] else: fname = fileList[0] if os.path.exists(fname): try: os.remove(fname) except OSError: _logger.warning("Cannot remove file %s", fname) pass if (savedData == 0) or multifile: outfileInstance = TiffIO.TiffIO(fname, mode="wb+") if multifile: # multiple files if dtype is None: data = datalist[savedData] else: data = datalist[savedData].astype(dtype) outfileInstance.writeImage(data, info={'Title': labels[savedData]}) savedData += 1 else: # a single file for i in range(ndata): if i == 1: outfileInstance = TiffIO.TiffIO(fname, mode="rb+") if dtype is None: data = datalist[i] else: data = datalist[i].astype(dtype) outfileInstance.writeImage(data, info={'Title': labels[i]}) savedData += 1 outfileInstance.close() # force file close
def __getitem__(self, args0): standardSlice = True indices = [] outputShape = [] scalarArgs = [] args = [] if not hasattr(args0, "__len__"): args0 = [args0] for i in range(len(self.__shape)): if i < len(args0): args.append(args0[i]) else: args.append(slice(None, None, None)) for i in range(len(args)): if isinstance(args[i], slice): start = args[i].start stop = args[i].stop step = args[i].step if start is None: start = 0 if stop is None: stop = self.__shape[i] if step is None: step = 1 if step < 1: raise ValueError("Step must be >= 1 (got %d)" % step) if start is None: start = 0 if start < 0: start = self.__shape[i]-start if stop < 0: stop = self.__shape[i]-stop if stop == start: raise ValueError("Zero-length selections are not allowed") indices.append(list(range(start, stop, step))) elif type(args[i]) == type([]): if len(args[i]): indices.append([int(x) for x in args[i]]) else: standardSlice = False elif type(args[i]) in [type(1), type(long(1))]: start = args[i] if start < 0: start = self.__shape[i] - start stop = start + 1 step = 1 start = args[i] args[i] = slice(start, stop, step) indices.append(list(range(start, stop, step))) scalarArgs.append(i) else: standardSlice = False if not standardSlice: print("args = ", args) raise NotImplemented("__getitem__(self, args) only works on slices") if len(indices) < 3: print("input args = ", args0) print("working args = ", args) print("indices = ", indices) raise NotImplemented("__getitem__(self, args) only works on slices") outputShape = [len(indices[0]), len(indices[1]), len(indices[2])] outputArray = numpy.zeros(outputShape, dtype=self.__dtype) # nbFiles = len(self.__fileList) nImagesPerFile = self.__nImagesPerFile if self.__imageStack: i = 0 rowMin = min(indices[1]) rowMax = max(indices[1]) for imageIndex in indices[0]: fileNumber = int(imageIndex/nImagesPerFile) if fileNumber != self.__oldFileNumber: self.__tmpInstance = TiffIO.TiffIO(self.__fileList[fileNumber], mode='rb+') self.__oldFileNumber = fileNumber imageNumber = imageIndex % nImagesPerFile imageData = self.__tmpInstance.getData(imageNumber, rowMin=rowMin, rowMax=rowMax) try: outputArray[i,:,:] = imageData[args[1],args[2]] except: print("outputArray[i,:,:].shape =",outputArray[i,:,:].shape) print("imageData[args[1],args[2]].shape = " , imageData[args[1],args[2]].shape) print("input args = ", args0) print("working args = ", args) print("indices = ", indices) print("scalarArgs = ", scalarArgs) raise i += 1 else: i = 0 rowMin = min(indices[0]) rowMax = max(indices[0]) for imageIndex in indices[-1]: fileNumber = int(imageIndex/nImagesPerFile) if fileNumber != self.__oldFileNumber: self.__tmpInstance = TiffIO.TiffIO(self.__fileList[fileNumber], mode='rb+') self.__oldFileNumber = fileNumber imageNumber = imageIndex % nImagesPerFile imageData = self.__tmpInstance.getData(imageNumber, rowMin=rowMin, rowMax=rowMax) outputArray[:,:, i] = imageData[args[0],args[1]] i += 1 if len(scalarArgs): finalShape = [] for i in range(len(outputShape)): if i in scalarArgs: continue finalShape.append(outputShape[i]) outputArray.shape = finalShape return outputArray
def loadFileList(self, filelist, dynamic=False, fileindex=0): if type(filelist) != type([]): filelist = [filelist] #retain the file list self.sourceName = filelist #the number of files nbFiles=len(filelist) #the intance to access the first file fileInstance = TiffIO.TiffIO(filelist[0]) #the number of images per file nImagesPerFile = fileInstance.getNumberOfImages() #get the dimensions from the image itself tmpImage = fileInstance.getImage(0) if self.__dtype is None: self.__dtype = tmpImage.dtype nRows, nCols = tmpImage.shape #stack shape if self.__imageStack: shape = (nbFiles * nImagesPerFile, nRows, nCols) else: shape = (nRows, nCols, nbFiles * nImagesPerFile) #we can create the stack if not dynamic: try: data = numpy.zeros(shape, self.__dtype) except (MemoryError, ValueError): dynamic = True if not dynamic: imageIndex = 0 self.onBegin(nbFiles * nImagesPerFile) for i in range(nbFiles): tmpInstance =TiffIO.TiffIO(filelist[i]) for j in range(nImagesPerFile): tmpImage = tmpInstance.getImage(j) if self.__imageStack: data[imageIndex,:,:] = tmpImage else: data[:,:,imageIndex] = tmpImage imageIndex += 1 self.incrProgressBar = imageIndex self.onProgress(imageIndex) self.onEnd() if dynamic: data = TiffArray(filelist, shape, self.__dtype, imagestack=self.__imageStack) self.info = {} self.data = data shape = self.data.shape for i in range(len(shape)): key = 'Dim_%d' % (i+1,) self.info[key] = shape[i] if self.__imageStack: self.info["McaIndex"] = 0 self.info["FileIndex"] = 1 else: self.info["McaIndex"] = 2 self.info["FileIndex"] = 0 self.info["SourceType"] = SOURCE_TYPE self.info["SourceName"] = self.sourceName