pathology/transformation_pipeline/ingestion_lib/gen_test_util.py (67 lines of code) (raw):
# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Helper functions for tests."""
import io
import os
import numpy as np
import openslide
import PIL.Image
import pydicom
from pathology.shared_libs.pydicom_version_util import pydicom_version_util
from pathology.transformation_pipeline.ingestion_lib import ingest_const
def test_file_path(*path: str) -> str:
"""Returns path to file in unit test."""
return os.path.normpath(
os.path.join(
os.path.dirname(__file__),
'..',
'..',
'transformation_pipeline',
'testdata',
*path,
)
)
def create_mock_wsi_dicom_dataset(barcode_value: str = '') -> pydicom.Dataset:
"""Returns pydicom Dataset with mock wsi DICOM metadata."""
ds = pydicom.Dataset()
if barcode_value:
ds.BarcodeValue = barcode_value
ds.StudyInstanceUID = '1.2.3'
ds.SeriesInstanceUID = '1.2.3.4'
ds.SOPInstanceUID = '1.2.3.4.5'
ds.SOPClassUID = ingest_const.DicomSopClasses.WHOLE_SLIDE_IMAGE.uid
ds.Modality = 'SM'
ds.BitsAllocated = 8
ds.BitsStored = 8
ds.HighBit = 7
ds.SamplesPerPixel = 1
ds.NumberOfFrames = 1
ds.Rows = 1
ds.Columns = 1
ds.TotalPixelMatrixColumns = 1
ds.TotalPixelMatrixRows = 1
ds.SpecimenLabelInImage = 'NO'
ds.BurnedInAnnotation = 'NO'
ds.ImageType = '\\'.join(
[ingest_const.ORIGINAL, ingest_const.PRIMARY, ingest_const.VOLUME]
)
return ds
def decode_image_from_bytes(image_bytes: bytes) -> np.ndarray:
"""Returns image from bytes."""
with PIL.Image.open(io.BytesIO(image_bytes)) as image:
return np.asarray(image)
def decode_image_from_file(path: str) -> np.ndarray:
"""Returns image from bytes."""
with PIL.Image.open(path) as image:
return np.asarray(image)
def write_test_dicom(path: str, base_ds: pydicom.Dataset):
file_meta = pydicom.dataset.FileMetaDataset()
file_meta.TransferSyntaxUID = (
ingest_const.DicomImageTransferSyntax.EXPLICIT_VR_LITTLE_ENDIAN
)
ds = pydicom.dataset.FileDataset(
'', base_ds, file_meta=file_meta, preamble=b'\0' * 128
)
pydicom_version_util.set_little_endian_explicit_vr(ds)
ds.save_as(path)
def is_openslide_file_valid(path: str) -> bool:
"""Returns True if ndpi_test.ndpi file is available."""
if not os.path.exists(path):
return False
try:
_ = openslide.OpenSlide(path)
return True
except (openslide.OpenSlideError, OSError) as _:
return False