-
convert
.rcpnl
file to.ome.tif
using
bfconvert sample.rcpnl sample.ome.tif
-
extract XML from converted
.ome.tif
file using
tiffcomment sample.ome.tif > output_metadata.xml
-
edit
output_metadata.xml
using text editor -
overwrite the metadata of
sample.ome.tif
usingtiffcomment
tiffcomment -set 'newmetadata.xml' sample.ome.tif
Last active
October 25, 2020 03:53
-
-
Save Yu-AnChen/0cd1e1715deaca272039ee5ad5048b4b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Using bftool to extract the xml | |
# adjust ram limit for larger file | |
# set BF_MAX_MEM=80g | |
# bftools\showinf.bat -omexml -nopix -novalid "Scan_20200929_094137_01x4x01180.rcpnl" > "Scan_20200929_094137_01x4x01180.rcpnl.xml" | |
# Manually cleanup the xml using text editor | |
from ashlar import reg | |
import skimage.io | |
c1r = reg.BioformatsReader('Scan_20200929_094137_01x4x01180.rcpnl') | |
kwargs_first = dict( | |
photometric='minisblack', metadata=None, bigtiff=True, | |
description='!!xml!!', append=True, check_contrast=False | |
) | |
kwargs_rest = kwargs_first.copy() | |
del kwargs_rest['description'] | |
num_images = 772 | |
out_name = 'Scan_20200929_094137_01x4x0{:04}.ome.tif'.format(num_images) | |
for i in range(num_images): | |
if i % 50 == 0: | |
print(i) | |
for j in range(4): | |
img = c1r.read(i, j) | |
k = kwargs_rest | |
if i == 0 and j == 0: | |
k = kwargs_first | |
skimage.io.imsave(out_name, img, **k) | |
import xml.etree.ElementTree as ET | |
image_el = ''' | |
<Image ID="Image:{image_num}" Name="{name} #{series}"> | |
<InstrumentRef ID="Instrument:0" /> | |
<ObjectiveSettings ID="Objective:0" /> | |
<Pixels BigEndian="false" DimensionOrder="XYCZT" ID="Pixels:{image_num}" Interleaved="false" | |
PhysicalSizeX="0.32499998807907104" PhysicalSizeXUnit="\xb5m" PhysicalSizeY="0.32499998807907104" | |
PhysicalSizeYUnit="\xb5m" PhysicalSizeZ="1.0" PhysicalSizeZUnit="\xb5m" SignificantBits="16" SizeC="4" | |
SizeT="1" SizeX="2560" SizeY="2160" SizeZ="1" Type="uint16"> | |
<Channel EmissionWavelength="431.0" EmissionWavelengthUnit="nm" ExcitationWavelength="395.0" | |
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:0" NDFilter="0.0" SamplesPerPixel="1"> | |
<LightPath /> | |
</Channel> | |
<Channel EmissionWavelength="525.0" EmissionWavelengthUnit="nm" ExcitationWavelength="485.0" | |
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:1" NDFilter="0.0" SamplesPerPixel="1"> | |
<LightPath /> | |
</Channel> | |
<Channel EmissionWavelength="590.0" EmissionWavelengthUnit="nm" ExcitationWavelength="555.0" | |
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:2" NDFilter="0.0" SamplesPerPixel="1"> | |
<LightPath /> | |
</Channel> | |
<Channel EmissionWavelength="690.0" EmissionWavelengthUnit="nm" ExcitationWavelength="651.0" | |
ExcitationWavelengthUnit="nm" ID="Channel:{image_num}:3" NDFilter="0.0" SamplesPerPixel="1"> | |
<LightPath /> | |
</Channel> | |
</Pixels> | |
</Image> | |
''' | |
tiffdata_el = ''' | |
<T> | |
<TiffData FirstC="0" FirstT="0" FirstZ="0" IFD="{aa}" PlaneCount="1"> | |
<UUID FileName="{filename}">{uuid}</UUID> | |
</TiffData> | |
<TiffData FirstC="1" FirstT="0" FirstZ="0" IFD="{bb}" PlaneCount="1"> | |
<UUID FileName="{filename}">{uuid}</UUID> | |
</TiffData> | |
<TiffData FirstC="2" FirstT="0" FirstZ="0" IFD="{cc}" PlaneCount="1"> | |
<UUID FileName="{filename}">{uuid}</UUID> | |
</TiffData> | |
<TiffData FirstC="3" FirstT="0" FirstZ="0" IFD="{dd}" PlaneCount="1"> | |
<UUID FileName="{filename}">{uuid}</UUID> | |
</TiffData> | |
</T> | |
''' | |
ET.register_namespace('', 'http://www.openmicroscopy.org/Schemas/OME/2016-06') | |
root = ET.fromstring(open(r'D:\yc296\20201011-CCR-092020-PDAC-TMA2\Scan_20200929_094137_01x4x01180.rcpnl.xml').read()) | |
plane_el = list(root.iter('{http://www.openmicroscopy.org/Schemas/OME/2016-06}Plane')) | |
for e in plane_el: | |
e.set('TheT', '0') | |
import uuid | |
img_uuid = uuid.uuid4().urn | |
root.remove(root[1]) | |
for i in range(num_images): | |
img_el = ET.fromstring(image_el.format(image_num=i, name=out_name, series=i+1)) | |
aa, bb, cc, dd = list(range(i*4, (i+1)*4)) | |
tiff_el = ET.fromstring(tiffdata_el.format(filename=out_name, uuid=img_uuid, aa=aa, bb=bb, cc=cc, dd=dd)) | |
img_el[2].extend(tiff_el[:]) | |
img_el[2].extend(plane_el[i*4:(i+1)*4]) | |
root.append(img_el) | |
root.set('UUID', img_uuid) | |
ET.ElementTree(root).write('{}.xml'.format(out_name), encoding='utf-8', xml_declaration=True) | |
# Using bftool to inject the xml | |
# bftools\tiffcomment.bat -set "Scan_20200929_094137_01x4x00772.ome.tif.xml" "Scan_20200929_094137_01x4x00772.ome.tif" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Using the correct character is required for a valid ome-xml - μm