#!/usr/bin/env python
__author__ = "Vanessa Sochat"
__copyright__ = "Copyright 2016-2022, Vanessa Sochat"
__license__ = "MIT"
import os
import shutil
import tempfile
import unittest
from copy import deepcopy
import pydicom
from pydicom import read_file
from deid.config import DeidRecipe
from deid.data import get_dataset
from deid.dicom.pixels import clean_pixel_data, has_burned_pixels
from deid.tests.common import get_file
from deid.utils import get_installdir
global generate_uid
[docs]class TestClean(unittest.TestCase):
[docs] def setUp(self):
self.pwd = get_installdir()
self.deidpath = os.path.abspath("%s/tests/resources/" % self.pwd)
self.dataset = get_dataset("animals")
self.tmpdir = tempfile.mkdtemp()
print("\n######################START######################")
[docs] def tearDown(self):
shutil.rmtree(self.tmpdir)
print("\n######################END########################")
[docs] def test_pixel_cleaner_remove_coordinates(self):
"""Test the pixel cleaner to ensure it appropriately clears specified pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "remove_coordinates.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[0:1024, 0:1024] = 0
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_remove_coordinates_dicom_file(self):
"""Test the pixel cleaner to ensure it appropriately clears specified pixels."""
dicom_file_data = pydicom.read_file(get_file(self.dataset))
inputpixels = deepcopy(dicom_file_data.pixel_array)
deid_path = os.path.join(self.deidpath, "remove_coordinates.dicom")
deid = DeidRecipe(deid_path)
out = has_burned_pixels(dicom_file_data, deid=deid)
self.assertTrue(out["flagged"])
outputpixels = clean_pixel_data(dicom_file=dicom_file_data, results=out)
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[0:1024, 0:1024] = 0
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_remove_all(self):
"""Test the pixel cleaner to ensure it appropriately clears all pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "remove_all.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[:, :] = 0
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_keepcoordinates_noaction(self):
"""Test the pixel cleaner to ensure that a keepcoordinates with no removecoordinates has no impact on the pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "keepcoordinates_noaction.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_keepcoordinates(self):
"""Test the pixel cleaner to ensure that a keepcoordinates retains appropriate pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "keepcoordinates.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
compare = inputpixels[0:1024, 0:1024] == outputpixels[0:1024, 0:1024]
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_remove_multiple(self):
"""Test the pixel cleaner to ensure that multiple remove coordinates in the same filter remove the appropriate pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "remove_coordinates_multiple.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[0:10, 0:10] = 0
inputpixels[10:20, 10:20] = 0
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_remove_multiple_filters(self):
"""Test the pixel cleaner to ensure that multiple remove coordinates in different filters remove the appropriate pixels."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "remove_coordinates_multiple_filters.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[0:10, 0:10] = 0
inputpixels[10:20, 10:20] = 0
compare = inputpixels == outputpixels
self.assertTrue(compare.all())
[docs] def test_pixel_cleaner_keepcoordinates_from(self):
"""Test the pixel cleaner to ensure that multiple keep coordinates retrieved from a dicom field are appropriately retained."""
from deid.dicom import DicomCleaner
dicom_file = get_file(self.dataset)
deid = os.path.join(self.deidpath, "keepcoordinates_from.dicom")
client = DicomCleaner(output_folder=self.tmpdir, deid=deid)
out = client.detect(dicom_file)
self.assertTrue(out["flagged"])
client.clean()
cleanedfile = client.save_dicom()
outputfile = read_file(cleanedfile)
outputpixels = outputfile.pixel_array
inputfile = read_file(dicom_file)
inputpixels = inputfile.pixel_array
compare = inputpixels == outputpixels
self.assertFalse(compare.all())
inputpixels[1000:2000, 0:1000] = 0
inputpixels[0:1000, 1000:2000] = 0
compare = inputpixels[0:2000, 0:2000] == outputpixels[0:2000, 0:2000]
self.assertTrue(compare.all())
if __name__ == "__main__":
unittest.main()