def test_save(self): testfile = path.join(thisdir, 'coretestdata', 'testsave') ext = ['.png', '.npy'] keys = self.imarr.keys() for e in ext: self.imarr.save(filename=testfile + e) load = ImageArray(testfile + e) self.assertTrue( all([k in load.keys() for k in keys]), 'problem saving metadata {} {}'.format(list(load.keys()), e)) if e == '.npy': #tolerance is really poor for png whcih savees in 8bit format self.assertTrue(np.allclose(self.imarr, load), 'data not the same for extension {}'.format(e)) os.remove(testfile + e) #tidy up
def test_save(self): testfile = path.join(thisdir, 'coretestdata', 'testsave.png') keys = self.imarr.keys() self.imarr.save(filename=testfile) load = ImageArray(testfile, asfloat=True) #del load["Loaded from"] self.assertTrue(all([k in keys for k in load.keys()]), 'problem saving metadata') self.assertTrue(np.allclose(self.imarr, load, atol=0.001)) os.remove(testfile) #tidy up
def test_save(self): testfile=path.join(thisdir,'coretestdata','testsave') ext = ['.png', '.npy'] keys=self.imarr.keys() for e in ext: self.imarr.save(filename=testfile+e) load=ImageArray(testfile+e) self.assertTrue(all([k in load.keys() for k in keys]), 'problem saving metadata {} {}'.format(list(load.keys()),e)) if e=='.npy': #tolerance is really poor for png whcih savees in 8bit format self.assertTrue(np.allclose(self.imarr, load), 'data not the same for extension {}'.format(e)) os.remove(testfile+e) #tidy up
class ImageArrayTest(unittest.TestCase): def setUp(self): #random array shape 3,4 self.arr = np.array([[0.41674764, 0.66100043, 0.91755303, 0.33796703], [0.06017535, 0.1440342, 0.34441777, 0.9915282], [0.2984083, 0.9167951, 0.73820304, 0.7655299]]) self.imarr = ImageArray(np.copy(self.arr)) #ImageArray object self.imarrfile = ImageArray( os.path.join(thisdir, 'coretestdata/im1_annotated.png')) #ImageArray object from file #####test loading with different datatypes #### def test_load_from_array(self): #from array self.assertTrue(np.array_equal(self.imarr, self.arr)) #int type imarr = ImageArray(np.arange(12, dtype="int32").reshape(3, 4)) self.assertTrue( imarr.dtype == np.dtype('int32'), "Failed to set correct dtype - actual dtype={}".format( imarr.dtype)) def test_load_from_ImageArray(self): #from ImageArray t = ImageArray(self.imarr) self.assertTrue(shares_memory(self.imarr, t), 'no overlap on creating ImageArray from ImageArray') def test_load_from_png(self): subpath = os.path.join("coretestdata", "im1_annotated.png") fpath = os.path.join(thisdir, subpath) anim = ImageArray(fpath) self.assertTrue( os.path.normpath(anim.metadata['Loaded from']) == os.path.normpath( fpath)) cwd = os.getcwd() os.chdir(thisdir) anim = ImageArray(subpath) #check full path is in loaded from metadata self.assertTrue( os.path.normpath( anim.metadata['Loaded from']) == os.path.normpath(fpath), 'Full path not in metadata: {}'.format(anim["Loaded from"])) os.chdir(cwd) def test_load_from_ImageFile(self): #uses the ImageFile.im attribute to set up ImageArray. Memory overlaps pass # imfi = ImageFile(self.arr) # imarr = ImageArray(imfi) # self.assertTrue(np.array_equal(imarr, imfi.image), 'Initialising from ImageFile failed') # self.assertTrue(shares_memory(imarr, imfi.image)) def test_load_from_list(self): t = ImageArray([[1, 3], [3, 2], [4, 3]]) self.assertTrue(np.array_equal(t, np.array([[1, 3], [3, 2], [4, 3]])), 'Initialising from list failed') def test_load_1d_data(self): t = ImageArray(np.arange(10) / 10.0) self.assertTrue(len(t.shape) == 2) #converts to 2d def test_load_no_args(self): #Should be a 2d empty array t = ImageArray() self.assertTrue(len(t.shape) == 2) self.assertTrue(t.size == 0) def test_load_bad_data(self): def testload(arg): ImageArray(arg) #dictionary self.assertRaises(ValueError, testload, {'a': 1}) #3d numpy array self.assertRaises(ValueError, testload, np.arange(27).reshape(3, 3, 3)) #bad filename self.assertRaises(ValueError, testload, 'sillyfile.xyz') def test_load_kwargs(self): #metadata keyword arg t = ImageArray(self.arr, metadata={'a': 5, 'b': 7}) self.assertTrue('a' in t.metadata.keys() and 'b' in t.metadata.keys()) self.assertTrue(t.metadata['a'] == 5) #asfloat t = ImageArray(np.arange(12).reshape(3, 4), asfloat=True) self.assertTrue(t.dtype == np.float64, 'Initialising asfloat failed') self.assertTrue('Loaded from' in t.metadata.keys(), 'Loaded from should always be in metadata') #####test attributes ## def test_filename(self): im = ImageArray(np.linspace(0, 1, 12).reshape(3, 4)) fpath = os.path.join(thisdir, 'coretestdata/im1_annotated.png') self.assertTrue(os.path.normpath(self.imarrfile.filename)\ == os.path.normpath(fpath)) im = ImageArray(np.linspace(0, 1, 12).reshape(3, 4)) im['Loaded from'] im.filename self.assertTrue(im.filename == '', '{}, {}'.format(self.imarr.shape, im.filename)) def test_clone(self): self.imarr['abc'] = 123 #add some metadata self.imarr['nested'] = [1, 2, 3] #add some nested metadata to check deepcopy self.imarr.userxyz = 123 #add a user attribute c = self.imarr.clone self.assertTrue(isinstance(c, ImageArray), 'Clone not ImageArray') self.assertTrue(np.array_equal(c, self.imarr), 'Clone not replicating elements') self.assertTrue(all([k in c.metadata.keys() for k in \ self.imarr.metadata.keys()]), 'Clone not replicating metadata') self.assertFalse(shares_memory(c, self.imarr), 'memory overlap on clone') #formal check self.imarr['bcd'] = 234 self.assertTrue('bcd' not in c.metadata.keys(), 'memory overlap for metadata on clone') self.imarr['nested'][0] = 2 self.assertTrue(self.imarr['nested'][0] != c['nested'][0], 'deepcopy not working on metadata') self.assertTrue(c.userxyz == 123) c.userxyz = 234 self.assertTrue(c.userxyz != self.imarr.userxyz) def test_metadata(self): self.assertTrue(isinstance(self.imarr.metadata, typeHintedDict)) self.imarr['testmeta'] = 'abc' self.assertTrue(self.imarr['testmeta'] == 'abc', 'Couldn\'t change metadata') del (self.imarr['testmeta']) self.assertTrue('testmeta' not in self.imarr.keys(), 'Couldn\'t delete metadata') #bad data def test(imarr): imarr.metadata = (1, 2, 3) self.assertRaises(TypeError, test, self.imarr) #check it won't let you do this ### test numpy like creation behaviour # def test_user_attributes(self): self.imarr.abc = 'new att' self.assertTrue(hasattr(self.imarr, 'abc')) t = ImageArray(self.imarr) self.assertTrue(hasattr(t, 'abc'), 'problem copying new attributes') t = self.imarr.view( ImageArray) #check array_finalize copies attribute over self.assertTrue(hasattr(t, 'abc')) t = self.imarr * np.random.random(self.imarr.shape) self.assertTrue(isinstance(t, ImageArray), 'problem with ufuncs') self.assertTrue(hasattr(t, 'abc'), "Ufunc lost attribute!") ##### test functionality ## def test_save(self): testfile = path.join(thisdir, 'coretestdata', 'testsave') ext = ['.png', '.npy'] keys = self.imarr.keys() for e in ext: self.imarr.save(filename=testfile + e) load = ImageArray(testfile + e) self.assertTrue(all([k in keys for k in load.keys()]), 'problem saving metadata') if e == '.npy': #tolerance is really poor for png whcih savees in 8bit format self.assertTrue(np.allclose(self.imarr, load), 'data not the same for extension {}'.format(e)) os.remove(testfile + e) #tidy up def test_savetiff(self): testfile = path.join(thisdir, 'coretestdata', 'testsave.tiff') #create a few different data types testb = ImageArray(np.zeros((4, 5), dtype=bool)) #bool testb[0, :] = True testui = ImageArray(np.arange(20).reshape(4, 5)) #int32 testi = ImageArray(np.copy(testui) - 10) testf = ImageArray(np.linspace(-1, 1, 20).reshape(4, 5)) #float64 for im in [testb, testui, testi, testf]: im['a'] = [1, 2, 3] im['b'] = 'abc' #add some test metadata im.filename = testfile im.save() n = ImageArray(testfile) self.n = n self.assertTrue( all([n['a'][i] == im['a'][i] for i in range(len(n['a']))])) self.assertTrue(n['b'] == im['b']) self.assertTrue( 'ImageArray.dtype' in n.metadata.keys()) #check the dtype metdata got added self.assertTrue(im.dtype == n.dtype) #check the datatype self.assertTrue(np.allclose(im, n)) #check the data def test_max_box(self): s = self.imarr.shape self.assertTrue(self.imarr.max_box == (0, s[1], 0, s[0])) def test_crop(self): c = self.imarr.crop((1, 3, 1, 4), copy=True) self.assertTrue(np.array_equal(c, self.imarr[1:4, 1:3]), 'crop didn\'t work') self.assertFalse(shares_memory(c, self.imarr), 'crop copy failed') c2 = self.imarr.crop(1, 3, 1, 4, copy=True) self.assertTrue(np.array_equal(c2, c), 'crop with seperate arguments didn\'t work') c3 = self.imarr.crop(box=(1, 3, 1, 4), copy=False) self.assertTrue(np.array_equal(c3, c), 'crop with no arguments failed') self.assertTrue(shares_memory(self.imarr, c3), 'crop with no copy failed') def test_asint(self): ui = self.imarr.asint() self.assertTrue(ui.dtype == np.uint16) intarr = np.array( [[27312, 43319, 60132, 22149], [3944, 9439, 22571, 64980], [19556, 60082, 48378, 50169]], dtype=np.uint16) self.assertTrue(np.array_equal(ui, intarr)) def test_other_funcs(self): """test imagefuncs add ons. the functions themselves are not checked and should include a few examples in the doc strings for testing""" self.assertTrue(hasattr(self.imarr, 'do_nothing'), 'imagefuncs not being added to dir') self.assertTrue(hasattr(self.imarr, 'img_as_float'), 'skimage funcs not being added to dir') im = self.imarr.do_nothing() #see if it can run self.assertTrue(np.allclose(im, self.imarr), 'imagefuncs not working') self.assertFalse(shares_memory(im, self.imarr), 'imagefunc failed to clone') im0 = ImageArray(np.linspace(0, 1, 12).reshape(3, 4)) im1 = im0.clone * 5 im2 = im1.rescale_intensity() #test skimage self.assertTrue(np.allclose(im2, im0), 'skimage func failed') self.assertFalse(shares_memory(im2, im1), 'skimage failed to clone') im3 = im1.exposure__rescale_intensity() #test call with module name self.assertTrue(np.allclose(im3, im0), 'skimage call with module name failed')
class ImageArrayTest(unittest.TestCase): def setUp(self): #random array shape 3,4 self.arr = np.array([[ 0.41674764, 0.66100043, 0.91755303, 0.33796703], [ 0.06017535, 0.1440342 , 0.34441777, 0.9915282 ], [ 0.2984083 , 0.9167951 , 0.73820304, 0.7655299 ]]) self.imarr = ImageArray(np.copy(self.arr)) #ImageArray object self.imarrfile = ImageArray(os.path.join(thisdir, 'coretestdata/im1_annotated.png')) #ImageArray object from file #####test loading with different datatypes #### def test_load_from_array(self): #from array self.assertTrue(np.array_equal(self.imarr,self.arr)) #int type imarr = ImageArray(np.arange(12,dtype="int32").reshape(3,4)) self.assertTrue(imarr.dtype==np.dtype('int32'),"Failed to set correct dtype - actual dtype={}".format(imarr.dtype)) def test_load_from_ImageArray(self): #from ImageArray t = ImageArray(self.imarr) self.assertTrue(shares_memory(self.imarr, t), 'no overlap on creating ImageArray from ImageArray') def test_load_from_png(self): subpath = os.path.join("coretestdata","im1_annotated.png") fpath = os.path.join(thisdir, subpath) anim=ImageArray(fpath) self.assertTrue(os.path.normpath(anim.metadata['Loaded from']) == os.path.normpath(fpath)) cwd = os.getcwd() os.chdir(thisdir) anim = ImageArray(subpath) #check full path is in loaded from metadata self.assertTrue(os.path.normpath(anim.metadata['Loaded from']) == os.path.normpath(fpath), 'Full path not in metadata: {}'.format(anim["Loaded from"])) os.chdir(cwd) def test_load_from_ImageFile(self): #uses the ImageFile.im attribute to set up ImageArray. Memory overlaps pass # imfi = ImageFile(self.arr) # imarr = ImageArray(imfi) # self.assertTrue(np.array_equal(imarr, imfi.image), 'Initialising from ImageFile failed') # self.assertTrue(shares_memory(imarr, imfi.image)) def test_load_from_list(self): t=ImageArray([[1,3],[3,2],[4,3]]) self.assertTrue(np.array_equal(t, np.array([[1,3],[3,2],[4,3]])), 'Initialising from list failed') def test_load_1d_data(self): t=ImageArray(np.arange(10)/10.0) self.assertTrue(len(t.shape)==2) #converts to 2d def test_load_no_args(self): #Should be a 2d empty array t=ImageArray() self.assertTrue(len(t.shape)==2) self.assertTrue(t.size==0) def test_load_bad_data(self): def testload(arg): ImageArray(arg) #dictionary self.assertRaises(ValueError, testload, {'a':1}) #3d numpy array self.assertRaises(ValueError, testload, np.arange(27).reshape(3,3,3)) #bad filename self.assertRaises(ValueError, testload, 'sillyfile.xyz') def test_load_kwargs(self): #metadata keyword arg t=ImageArray(self.arr, metadata={'a':5, 'b':7}) self.assertTrue('a' in t.metadata.keys() and 'b' in t.metadata.keys()) self.assertTrue(t.metadata['a']==5) #asfloat t=ImageArray(np.arange(12).reshape(3,4), asfloat=True) self.assertTrue(t.dtype == np.float64, 'Initialising asfloat failed') self.assertTrue('Loaded from' in t.metadata.keys(), 'Loaded from should always be in metadata') #####test attributes ## def test_filename(self): im = ImageArray(np.linspace(0,1,12).reshape(3,4)) fpath = os.path.join(thisdir, 'coretestdata/im1_annotated.png') self.assertTrue(os.path.normpath(self.imarrfile.filename)\ == os.path.normpath(fpath)) im = ImageArray(np.linspace(0,1,12).reshape(3,4)) im['Loaded from'] im.filename self.assertTrue(im.filename == '', '{}, {}'.format(self.imarr.shape, im.filename)) def test_clone(self): self.imarr['abc'] = 123 #add some metadata self.imarr['nested'] = [1,2,3] #add some nested metadata to check deepcopy self.imarr.userxyz = 123 #add a user attribute c = self.imarr.clone self.assertTrue(isinstance(c,ImageArray), 'Clone not ImageArray') self.assertTrue(np.array_equal(c,self.imarr),'Clone not replicating elements') self.assertTrue(all([k in c.metadata.keys() for k in \ self.imarr.metadata.keys()]), 'Clone not replicating metadata') self.assertFalse(shares_memory(c, self.imarr), 'memory overlap on clone') #formal check self.imarr['bcd'] = 234 self.assertTrue('bcd' not in c.metadata.keys(), 'memory overlap for metadata on clone') self.imarr['nested'][0] = 2 self.assertTrue(self.imarr['nested'][0] != c['nested'][0], 'deepcopy not working on metadata') self.assertTrue(c.userxyz == 123) c.userxyz = 234 self.assertTrue(c.userxyz != self.imarr.userxyz) def test_metadata(self): self.assertTrue(isinstance(self.imarr.metadata,typeHintedDict)) self.imarr['testmeta']='abc' self.assertTrue(self.imarr['testmeta']=='abc', 'Couldn\'t change metadata') del(self.imarr['testmeta']) self.assertTrue('testmeta' not in self.imarr.keys(),'Couldn\'t delete metadata') #bad data def test(imarr): imarr.metadata=(1,2,3) self.assertRaises(TypeError, test, self.imarr) #check it won't let you do this ### test numpy like creation behaviour # def test_user_attributes(self): self.imarr.abc = 'new att' self.assertTrue(hasattr(self.imarr, 'abc')) t = ImageArray(self.imarr) self.assertTrue(hasattr(t, 'abc'), 'problem copying new attributes') t = self.imarr.view(ImageArray) #check array_finalize copies attribute over self.assertTrue(hasattr(t, 'abc')) t = self.imarr * np.random.random(self.imarr.shape) self.assertTrue(isinstance(t, ImageArray), 'problem with ufuncs') self.assertTrue(hasattr(t, 'abc'),"Ufunc lost attribute!") ##### test functionality ## def test_save(self): testfile=path.join(thisdir,'coretestdata','testsave') ext = ['.png', '.npy'] keys=self.imarr.keys() for e in ext: self.imarr.save(filename=testfile+e) load=ImageArray(testfile+e) self.assertTrue(all([k in load.keys() for k in keys]), 'problem saving metadata {} {}'.format(list(load.keys()),e)) if e=='.npy': #tolerance is really poor for png whcih savees in 8bit format self.assertTrue(np.allclose(self.imarr, load), 'data not the same for extension {}'.format(e)) os.remove(testfile+e) #tidy up def test_savetiff(self): testfile=path.join(thisdir,'coretestdata','testsave.tiff') #create a few different data types testb = ImageArray(np.zeros((4,5), dtype=bool)) #bool testb[0,:]=True testui = ImageArray(np.arange(20).reshape(4,5)) #int32 testi = ImageArray(np.copy(testui)-10) testf = ImageArray(np.linspace(-1,1,20).reshape(4,5)) #float64 for im in [testb, testui, testi, testf]: im['a']=[1,2,3] im['b']='abc' #add some test metadata im.filename=testfile im.save() n = ImageArray(testfile) self.n=n self.assertTrue(all([n['a'][i]==im['a'][i] for i in range(len(n['a']))])) self.assertTrue(n['b']==im['b']) self.assertTrue('ImageArray.dtype' in n.metadata.keys()) #check the dtype metdata got added self.assertTrue(im.dtype==n.dtype) #check the datatype self.assertTrue(np.allclose(im, n)) #check the data def test_max_box(self): s=self.imarr.shape self.assertTrue(self.imarr.max_box==(0,s[1],0,s[0])) def test_crop(self): c=self.imarr.crop((1,3,1,4),copy=True) self.assertTrue(np.array_equal(c,self.imarr[1:4,1:3]),'crop didn\'t work') self.assertFalse(shares_memory(c,self.imarr), 'crop copy failed') c2=self.imarr.crop(1,3,1,4,copy=True) self.assertTrue(np.array_equal(c2,c),'crop with seperate arguments didn\'t work') c3 = self.imarr.crop(box=(1,3,1,4), copy=False) self.assertTrue(np.array_equal(c3,c), 'crop with no arguments failed') self.assertTrue(shares_memory(self.imarr, c3), 'crop with no copy failed') def test_asint(self): ui = self.imarr.asint() self.assertTrue(ui.dtype==np.uint16) intarr = np.array([[27312, 43319, 60132, 22149], [ 3944, 9439, 22571, 64980], [19556, 60082, 48378, 50169]], dtype=np.uint16) self.assertTrue(np.array_equal(ui,intarr)) def test_other_funcs(self): """test imagefuncs add ons. the functions themselves are not checked and should include a few examples in the doc strings for testing""" self.assertTrue(hasattr(self.imarr,'do_nothing'), 'imagefuncs not being added to dir') self.assertTrue(hasattr(self.imarr,'img_as_float'), 'skimage funcs not being added to dir') im = self.imarr.do_nothing() #see if it can run self.assertTrue(np.allclose(im, self.imarr), 'imagefuncs not working') self.assertFalse(shares_memory(im, self.imarr), 'imagefunc failed to clone') im0 = ImageArray(np.linspace(0,1,12).reshape(3,4)) im1 = im0.clone * 5 im2 = im1.rescale_intensity() #test skimage self.assertTrue(np.allclose(im2, im0), 'skimage func failed') self.assertFalse(shares_memory(im2, im1), 'skimage failed to clone') im3 = im1.exposure__rescale_intensity() #test call with module name self.assertTrue(np.allclose(im3, im0), 'skimage call with module name failed')