forked from QBI-Microscopy/Fiji-scripts
/
Grid_Stitch_Plugin.py
129 lines (110 loc) · 4.07 KB
/
Grid_Stitch_Plugin.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import sys
import os
import time
import math
import ij
from ij import IJ
from ij import ImageStack, ImagePlus
from ij.io import OpenDialog
from ij.process import ShortProcessor
from loci.plugins import BF
from loci.plugins.in import ImporterOptions
from loci.formats import ImageReader,ImageWriter
from loci.formats import MetadataTools
from loci.common import DataTools
from ome.xml.meta import OMEXMLMetadata
from ome.xml.model.primitives import PositiveInteger,PositiveFloat
from ome.xml.model.enums import DimensionOrder, PixelType
from java.lang import StringBuffer
def write_fused(output_path,meta):
imp = ij.WindowManager.getCurrentImage()
meta.setPixelsSizeX(PositiveInteger(imp.getWidth()),0)
meta.setPixelsSizeY(PositiveInteger(imp.getHeight()),0)
writer = ImageWriter()
writer.setCompression('LZW')
writer.setMetadataRetrieve(meta)
writer.setId("%s/fused.ome.tif"%output_path)
littleEndian = not writer.getMetadataRetrieve().getPixelsBinDataBigEndian(0, 0)
planes = imp.getStack()
for p in range(planes.getSize()):
proc = planes.getProcessor(p+1)
writer.saveBytes(p,DataTools.shortsToBytes(proc.getPixels(), littleEndian))
writer.close()
def run_stitching(tiles_dir):
IJ.run("Grid/Collection stitching")
def write_tiles(r,tiles_dir,theT,sizeC,sizeZ,meta):
writer = ImageWriter()
writer.setCompression('LZW')
writer.setMetadataRetrieve(meta)
writer.setId("%s/tile_%s.ome.tif"%(tiles_dir,theT))
planes = sizeZ * sizeC
p = 0
for theZ in range(sizeZ):
for theC in range(sizeC):
writer.saveBytes(p,r.openBytes(reader.getIndex(theZ, theC, theT)))
p += 1
writer.close()
def set_metadata(inputMeta,outputMeta):
outputMeta.setImageID("Image:0", 0)
outputMeta.setPixelsID("Pixels:0", 0)
outputMeta.setPixelsBinDataBigEndian(False, 0, 0)
outputMeta.setPixelsDimensionOrder(DimensionOrder.XYCZT, 0)
outputMeta.setPixelsType(inputMeta.getPixelsType(0),0)
outputMeta.setPixelsPhysicalSizeX(inputMeta.getPixelsPhysicalSizeX(0),0)
outputMeta.setPixelsPhysicalSizeY(inputMeta.getPixelsPhysicalSizeY(0),0)
outputMeta.setPixelsPhysicalSizeZ(inputMeta.getPixelsPhysicalSizeZ(0),0)
outputMeta.setPixelsSizeX(inputMeta.getPixelsSizeX(0),0)
outputMeta.setPixelsSizeY(inputMeta.getPixelsSizeY(0),0)
outputMeta.setPixelsSizeZ(inputMeta.getPixelsSizeZ(0),0)
outputMeta.setPixelsSizeC(inputMeta.getPixelsSizeC(0),0)
outputMeta.setPixelsSizeT(PositiveInteger(1),0)
sizeZ = inputMeta.getPixelsSizeZ(0).getValue()
sizeC = inputMeta.getPixelsSizeC(0).getValue()
sizeT = inputMeta.getPixelsSizeT(0).getValue()
for c in range(sizeC):
outputMeta.setChannelID("Channel:0:" + str(c), 0, c);
spp = inputMeta.getChannelSamplesPerPixel(0,c)
outputMeta.setChannelSamplesPerPixel(spp, 0, c);
name = inputMeta.getChannelName(0,c)
color = inputMeta.getChannelColor(0,c)
outputMeta.setChannelName(name,0,c)
outputMeta.setChannelColor(color,0,c)
return outputMeta
def get_reader(file, inputMeta):
options = ImporterOptions()
options.setId(file)
imps = BF.openImagePlus(options)
reader = ImageReader()
reader.setMetadataStore(inputMeta)
reader.setId(file)
return reader
def get_path():
od = OpenDialog("Choose Spinning disk file", None)
srcDir = od.getDirectory()
if srcDir is None:
# User canceled the dialog
sys.exit(0)
file = os.path.join(srcDir, od.getFileName())
return srcDir,file
def run_script():
input_dir,input_path = get_path()
inputMeta = MetadataTools.createOMEXMLMetadata()
outputMeta = MetadataTools.createOMEXMLMetadata()
reader = get_reader(input_path,inputMeta)
outputMeta = set_metadata(inputMeta,outputMeta)
tiles_dir = os.path.join(input_dir,"tiles")
if not os.path.exists(tiles_dir):
os.makedirs(tiles_dir)
sizeZ = inputMeta.getPixelsSizeZ(0).getValue()
sizeC = inputMeta.getPixelsSizeC(0).getValue()
sizeT = inputMeta.getPixelsSizeT(0).getValue()
for theT in range(sizeT):
write_tiles(reader,tiles_dir,theT,sizeC,sizeZ,outputMeta)
last_tile = tiles_dir + 'tile_%s.ome.tif'%(sizeT-1)
while not os.path.exists(last_tile):
time.sleep(1)
reader.close()
run_stitching(tiles_dir)
write_fused(tiles_dir,outputMeta)
if __name__=='__main__':
run_script()