Compare commits

...
Sign in to create a new pull request.

10 commits

Author SHA1 Message Date
jevans
2c780af3f0 added several near duplicate tests from opj suite, some refactoring
Rewrite of read method tests with area parameter.  They run much faster now.
2014-09-14 17:26:10 -04:00
jevans
18c1687b28 Not supporting on 1.5 2014-09-13 20:35:35 -04:00
jevans
27b67113bc Added single pixel and component retrieval. 2014-09-13 12:36:03 -04:00
jevans
7f60811135 More progress. All UTs passing on Mac/3.4.1/2.1.0
__getitem__  method needs a refactor.  Need to test on JPX file with
multiple images.
2014-09-13 09:31:11 -04:00
jevans
c61bf0babe Merge branch 'issue246' of https://github.com/quintusdias/glymur into issue246 2014-09-12 21:12:51 -04:00
John Evans
f7b7b9a0df __keyitem__ parameter now assumed to be either integer or slice. No
longer erroring out when mixing resolution reduction with horiz/vert
slicing, but neither is it tested.
2014-09-12 16:46:08 -04:00
John Evans
79a0b7edb8 Further along. 2014-09-12 11:08:22 -04:00
John Evans
6b66d4f604 Do not show VIM swp files in output of "git status" 2014-09-12 10:06:59 -04:00
John Evans
276a74ecaa starting work to allow full resolution slicing 2014-09-12 10:06:09 -04:00
John Evans
3adb09e6f4 refactoring slice protocol tests 2014-09-12 10:05:40 -04:00
4 changed files with 522 additions and 288 deletions

1
.gitignore vendored
View file

@ -1 +1,2 @@
*.pyc *.pyc
*.swp

View file

@ -759,49 +759,99 @@ class Jp2k(Jp2kBox):
return boxes return boxes
def __getitem__(self, *pargs): def __getitem__(self, pargs):
""" """
Slicing protocol.
""" """
if isinstance(pargs[0], slice): if re.match("1.", version.openjpeg_version):
msg = "Not implemented for version 1.x of OpenJPEG. Use the read "
msg += "method instead."
raise NotImplementedError(msg)
codestream = self.get_codestream(header_only=True)
if isinstance(pargs, int):
# Not a very good use of this protocol, but technically legal.
# This retrieves a single row.
row = pargs
area = (row, 0, row + 1, codestream.segment[1].xsiz)
return self.read(area=area).squeeze()
if isinstance(pargs, slice):
# Case of jp2[:], i.e. retrieve the entire image.
#
# Should have a slice object where start = stop = step = None # Should have a slice object where start = stop = step = None
slc = pargs[0] return self.read()
if slc.start is None and slc.stop is None and slc.step is None:
return self.read()
else:
raise IndexError("Illegal syntax.")
if isinstance(pargs[0], tuple): if isinstance(pargs, tuple) and all(isinstance(x, int) for x in pargs):
ridx = pargs[0][0] # Retrieve a single pixel.
cidx = pargs[0][1] # Something like jp2[r, c]
row = pargs[0]
col = pargs[1]
area = (row, col, row + 1, col + 1)
pixel = self.read(area=area).squeeze()
if ((ridx.start is not None) or if len(pargs) == 2:
(ridx.stop is not None) or return pixel
(cidx.start is not None) or elif len(pargs) == 3:
(cidx.stop is not None)): return pixel[pargs[2]]
msg = "Only strides are supported when slicing a Jp2k object."
raise IndexError(msg)
if ridx.step is None and cidx.step is None: # Assuming pargs is a tuple of slices from now on.
step = 1 rows = pargs[0]
elif ridx.step != cidx.step: cols = pargs[1]
msg = "Row and column strides must be the same." if len(pargs) == 2:
raise IndexError(msg) bands = slice(None, None, None)
else: else:
step = ridx.step bands = pargs[2]
if np.log2(step) != np.floor(np.log2(step)): if rows.step is None:
msg = "Row and column strides must be powers of 2." rows_step = 1
raise IndexError(msg) else:
rows_step = rows.step
data = self.read(rlevel=np.int(np.log2(step))) if cols.step is None:
if len(pargs[0]) == 2: cols_step = 1
return data else:
cols_step = cols.step
# Ok, 3 arguments in pargs. if rows_step != cols_step:
if isinstance(pargs[0][2], slice): msg = "Row and column strides must be the same."
return data[:,:,pargs[0][2]] raise IndexError(msg)
elif isinstance(pargs[0][2], int):
return data[:,:,pargs[0][2]] # Ok, reduce layer step is the same in both xy directions, so just take
# one of them.
step = rows_step
if np.log2(step) != np.floor(np.log2(step)):
msg = "Row and column strides must be powers of 2."
raise IndexError(msg)
if rows.start is None:
rows_start = 0
else:
rows_start = rows.start
if rows.stop is None:
rows_stop = codestream.segment[1].ysiz
else:
rows_stop = rows.stop
if cols.start is None:
cols_start = 0
else:
cols_start = cols.start
if cols.stop is None:
cols_stop = codestream.segment[1].xsiz
else:
cols_stop = cols.stop
area = (rows_start, cols_start, rows_stop, cols_stop)
data = self.read(area=area, rlevel=np.int(np.log2(step)))
if len(pargs) == 2:
return data
# Ok, 3 arguments in pargs.
return data[:, :, bands]
def read(self, **kwargs): def read(self, **kwargs):

View file

@ -52,6 +52,306 @@ def load_tests(loader, tests, ignore):
return tests return tests
@unittest.skipIf(glymur.version.openjpeg_version[0] == '1',
"Slice protocol not supported in version 1.x")
class TestSliceProtocol(unittest.TestCase):
"""
Test slice protocol, i.e. when using [ ] to read image data.
"""
@classmethod
def setUpClass(self):
self.jp2 = Jp2k(glymur.data.nemo())
self.jp2_data = self.jp2.read()
self.j2k = Jp2k(glymur.data.goodstuff())
self.j2k_data = self.j2k.read()
def test_resolution_strides_cannot_differ(self):
with self.assertRaises(IndexError):
# Strides in x/y directions cannot differ.
self.j2k[::2, ::3]
def test_resolution_strides_cannot_differ(self):
with self.assertRaises(IndexError):
# Strides in x/y directions cannot differ.
self.j2k[::2, ::3]
def test_resolution_strides_must_be_powers_of_two(self):
with self.assertRaises(IndexError):
self.j2k[::3, ::3]
def test_integer_index_in_3d(self):
for j in [0, 1, 2]:
band = self.j2k[:, :, j]
np.testing.assert_array_equal(self.j2k_data[:, :, j], band)
def test_slice_in_third_dimension(self):
actual = self.j2k[:,:,1:3]
expected = self.j2k_data[:,:,1:3]
np.testing.assert_array_equal(actual, expected)
def test_reduce_resolution_and_slice_in_third_dimension(self):
d = self.j2k[::2, ::2, 1:3]
all = self.j2k.read(rlevel=1)
np.testing.assert_array_equal(all[:,:,1:3], d)
def test_retrieve_single_row(self):
actual = self.jp2[0]
expected = self.jp2_data[0]
np.testing.assert_array_equal(actual, expected)
def test_retrieve_single_pixel(self):
actual = self.jp2[0,0]
expected = self.jp2_data[0, 0]
np.testing.assert_array_equal(actual, expected)
def test_retrieve_single_component(self):
actual = self.jp2[20,20,2]
expected = self.jp2_data[20, 20, 2]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_quarters_upper_left(self):
actual = self.jp2[:728, :1296]
expected = self.jp2_data[:728, :1296]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_quarters_lower_left(self):
actual = self.jp2[728:, :1296]
expected = self.jp2_data[728:, :1296]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_quarters_upper_right(self):
actual = self.jp2[:728, 1296:]
expected = self.jp2_data[:728, 1296:]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_quarters_lower_right(self):
actual = self.jp2[728:, 1296:]
expected = self.jp2_data[728:, 1296:]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_quarters_center(self):
actual = self.jp2[364:1092, 648:1942]
expected = self.jp2_data[364:1092, 648:1942]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_halves_left(self):
actual = self.jp2[:, :1296]
expected = self.jp2_data[:, :1296]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_right_half(self):
actual = self.jp2[:, 1296:]
expected = self.jp2_data[:, 1296:]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_top_half(self):
actual = self.jp2[:728, :]
expected = self.jp2_data[:728, :]
np.testing.assert_array_equal(actual, expected)
def test_full_resolution_slicing_by_bottom_half(self):
actual = self.jp2[728:, :]
expected = self.jp2_data[728:, :]
np.testing.assert_array_equal(actual, expected)
def test_region_rlevel1(self):
actual = self.jp2[0:201:2, 0:201:2]
expected = self.jp2.read(area=(0, 0, 201, 201), rlevel=1)
np.testing.assert_array_equal(actual, expected)
def test_region_rlevel1_slice_start_is_none(self):
actual = self.jp2[:201:2, :201:2]
expected = self.jp2.read(area=(0, 0, 201, 201), rlevel=1)
np.testing.assert_array_equal(actual, expected)
def test_region_rlevel1_slice_stop_is_none(self):
actual = self.jp2[201::2, 201::2]
expected = self.jp2.read(area=(201, 201, 1456, 2592), rlevel=1)
np.testing.assert_array_equal(actual, expected)
def test_region_rlevel1(self):
actual = self.jp2[0:202:2, 0:202:2]
expected = self.jp2.read(area=(0, 0, 202, 202), rlevel=1)
np.testing.assert_array_equal(actual, expected)
def test_slice_protocol_2d_reduce_resolution(self):
d = self.j2k[:]
self.assertEqual(d.shape, (800, 480, 3))
d = self.j2k[::1, ::1]
self.assertEqual(d.shape, (800, 480, 3))
d = self.j2k[::2, ::2]
self.assertEqual(d.shape, (400, 240, 3))
d = self.j2k[::4, ::4]
self.assertEqual(d.shape, (200, 120, 3))
d = self.j2k[::8, ::8]
self.assertEqual(d.shape, (100, 60, 3))
d = self.j2k[::16, ::16]
self.assertEqual(d.shape, (50, 30, 3))
d = self.j2k[::32, ::32]
self.assertEqual(d.shape, (25, 15, 3))
@unittest.skipIf(OPJ_DATA_ROOT is None,
"OPJ_DATA_ROOT environment variable not set")
@unittest.skipIf(glymur.version.openjpeg_version[0] == '1',
"Slice protocol not supported in version 1.x")
class TestSliceProtocolOpjData(unittest.TestCase):
"""
Test slice protocol, i.e. when using [ ] to read image data.
These correspond to tests for the read method with the area parameter.
"""
@classmethod
def setUpClass(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
self.j2k = Jp2k(jfile)
self.j2k_data = self.j2k.read()
self.j2k_half_data = self.j2k.read(rlevel=1)
self.j2k_quarter_data = self.j2k.read(rlevel=2)
def test_NR_DEC_p1_04_j2k_43_decode(self):
actual = self.j2k[:1024, :1024]
expected = self.j2k_data
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_44_decode(self):
actual = self.j2k[640:768, 512:640]
expected = self.j2k_data[640:768, 512:640]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_45_decode(self):
actual = self.j2k[896:1024, 896:1024]
expected = self.j2k_data[896:1024, 896:1024]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_46_decode(self):
actual = self.j2k[500:800, 100:300]
expected = self.j2k_data[500:800, 100:300]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_47_decode(self):
actual = self.j2k[520:600, 260:360]
expected = self.j2k_data[520:600, 260:360]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_48_decode(self):
actual = self.j2k[520:660, 260:360]
expected = self.j2k_data[520:660, 260:360]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_49_decode(self):
actual = self.j2k[520:600, 360:400]
expected = self.j2k_data[520:600, 360:400]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_50_decode(self):
actual = self.j2k[:1024:4, :1024:4]
expected = self.j2k_quarter_data[:256, :256]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_51_decode(self):
actual = self.j2k[640:768:4, 512:640:4]
expected = self.j2k_quarter_data[160:192, 128:160]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_52_decode(self):
actual = self.j2k[896:1024:4, 896:1024:4]
expected = self.j2k_quarter_data[224:352, 224:352]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_53_decode(self):
actual = self.j2k[500:800:4, 100:300:4]
expected = self.j2k_quarter_data[125:200, 25:75]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_54_decode(self):
actual = self.j2k[520:600:4, 260:360:4]
expected = self.j2k_quarter_data[130:150, 65:90]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_55_decode(self):
actual = self.j2k[520:660:4, 260:360:4]
expected = self.j2k_quarter_data[130:165, 65:90]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_56_decode(self):
actual = self.j2k[520:600:4, 360:400:4]
expected = self.j2k_quarter_data[130:150, 90:100]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_06_j2k_75_decode(self):
# Image size would be 0 x 0.
with self.assertRaises((IOError, OSError)):
self.j2k[9:12:4, 9:12:4]
def test_NR_DEC_p0_04_j2k_85_decode(self):
actual = self.j2k[:256, :256]
expected = self.j2k_data[:256, :256]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_86_decode(self):
actual = self.j2k[:128, 128:256]
expected = self.j2k_data[:128, 128:256]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_87_decode(self):
actual = self.j2k[10:200, 50:120]
expected = self.j2k_data[10:200, 50:120]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_88_decode(self):
actual = self.j2k[150:210, 10:190]
expected = self.j2k_data[150:210, 10:190]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_89_decode(self):
actual = self.j2k[80:150, 100:200]
expected = self.j2k_data[80:150, 100:200]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_90_decode(self):
actual = self.j2k[20:50, 150:200]
expected = self.j2k_data[20:50, 150:200]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_91_decode(self):
actual = self.j2k[:256:4, :256:4]
expected = self.j2k_quarter_data[0:64, 0:64]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_92_decode(self):
actual = self.j2k[:128:4, 128:256:4]
expected = self.j2k_quarter_data[:32, 32:64]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_93_decode(self):
actual = self.j2k[10:200:4, 50:120:4]
expected = self.j2k_quarter_data[3:50, 13:30]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_94_decode(self):
actual = self.j2k[150:210:4, 10:190:4]
expected = self.j2k_quarter_data[38:53, 3:48]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_95_decode(self):
actual = self.j2k[80:150:4, 100:200:4]
expected = self.j2k_quarter_data[20:38, 25:50]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p0_04_j2k_96_decode(self):
actual = self.j2k[20:50:4, 150:200:4]
expected = self.j2k_quarter_data[5:13, 38:50]
np.testing.assert_array_equal(actual, expected)
class TestJp2k(unittest.TestCase): class TestJp2k(unittest.TestCase):
"""These tests should be run by just about all configuration.""" """These tests should be run by just about all configuration."""
@ -63,77 +363,6 @@ class TestJp2k(unittest.TestCase):
def tearDown(self): def tearDown(self):
pass pass
def test_slice_protocol_negative(self):
"""
"""
j = Jp2k(self.j2kfile)
with self.assertRaises(IndexError):
# Strides in x/y directions cannot differ.
d = j[::2, ::3]
with self.assertRaises(IndexError):
# Strides in x/y direction must be powers of 2.
d = j[::3, ::3]
# start and stop are not supported when slicing on Jp2k object
with self.assertRaises(IndexError):
d = j[2::2, 2::2]
with self.assertRaises(IndexError):
d = j[:8:2, :8:2]
with self.assertRaises(IndexError):
d = j[2:8:2, 2:8:2]
def test_slice_protocol_3d(self):
"""
"""
j = Jp2k(self.j2kfile)
all = j.read()
d = j[:,:,0]
np.testing.assert_array_equal(all[:,:,0], d)
d = j[:,:,1]
np.testing.assert_array_equal(all[:,:,1], d)
d = j[:,:,2]
np.testing.assert_array_equal(all[:,:,2], d)
d = j[:,:,1:3]
np.testing.assert_array_equal(all[:,:,1:3], d)
d = j[::2, ::2, 1:3]
all = j.read(rlevel=1)
np.testing.assert_array_equal(all[:,:,1:3], d)
def test_slice_protocol_2d(self):
"""
"""
j = Jp2k(self.j2kfile)
d = j[:]
self.assertEqual(d.shape, (800, 480, 3))
# Stride of one.
d = j[::1, ::1]
self.assertEqual(d.shape, (800, 480, 3))
# Stride of 2.
d = j[::2, ::2]
self.assertEqual(d.shape, (400, 240, 3))
d = j[::4, ::4]
self.assertEqual(d.shape, (200, 120, 3))
d = j[::8, ::8]
self.assertEqual(d.shape, (100, 60, 3))
d = j[::16, ::16]
self.assertEqual(d.shape, (50, 30, 3))
d = j[::32, ::32]
self.assertEqual(d.shape, (25, 15, 3))
@unittest.skipIf(os.name == "nt", "Unexplained failure on windows") @unittest.skipIf(os.name == "nt", "Unexplained failure on windows")
def test_irreversible(self): def test_irreversible(self):

View file

@ -124,105 +124,6 @@ class TestSuite2point1(unittest.TestCase):
Jp2k(jfile).read() Jp2k(jfile).read()
self.assertTrue(True) self.assertTrue(True)
def test_NR_DEC_p1_04_j2k_43_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(0, 0, 1024, 1024))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata)
def test_NR_DEC_p1_04_j2k_44_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(640, 512, 768, 640))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[640:768, 512:640])
def test_NR_DEC_p1_04_j2k_45_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(896, 896, 1024, 1024))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[896:1024, 896:1024])
def test_NR_DEC_p1_04_j2k_46_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(500, 100, 800, 300))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[500:800, 100:300])
def test_NR_DEC_p1_04_j2k_47_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 260, 600, 360))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[520:600, 260:360])
def test_NR_DEC_p1_04_j2k_48_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 260, 660, 360))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[520:660, 260:360])
def test_NR_DEC_p1_04_j2k_49_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 360, 600, 400))
odata = jp2k.read()
np.testing.assert_array_equal(ssdata, odata[520:600, 360:400])
def test_NR_DEC_p1_04_j2k_50_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(0, 0, 1024, 1024), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[0:256, 0:256])
def test_NR_DEC_p1_04_j2k_51_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(640, 512, 768, 640), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[160:192, 128:160])
def test_NR_DEC_p1_04_j2k_52_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(896, 896, 1024, 1024), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[224:352, 224:352])
def test_NR_DEC_p1_04_j2k_53_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(500, 100, 800, 300), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[125:200, 25:75])
def test_NR_DEC_p1_04_j2k_54_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 260, 600, 360), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[130:150, 65:90])
def test_NR_DEC_p1_04_j2k_55_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 260, 660, 360), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[130:165, 65:90])
def test_NR_DEC_p1_04_j2k_56_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(520, 360, 600, 400), rlevel=2)
odata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(ssdata, odata[130:150, 90:100])
def test_NR_DEC_p1_04_j2k_57_decode(self): def test_NR_DEC_p1_04_j2k_57_decode(self):
jfile = opj_data_file('input/conformance/p1_04.j2k') jfile = opj_data_file('input/conformance/p1_04.j2k')
jp2k = Jp2k(jfile) jp2k = Jp2k(jfile)
@ -263,127 +164,180 @@ class TestSuite2point1(unittest.TestCase):
with self.assertRaises(IOError): with self.assertRaises(IOError):
j.read() j.read()
def test_NR_DEC_p1_06_j2k_70_decode(self): @unittest.skipIf(OPJ_DATA_ROOT is None,
"OPJ_DATA_ROOT environment variable not set")
@unittest.skipIf(re.match(r'''(1|2.0.0)''',
glymur.version.openjpeg_version) is not None,
"Only supported in 2.0.1 or higher")
class TestReadArea(unittest.TestCase):
"""
Runs tests introduced in version 2.0+ or that pass only in 2.0+
Specifically for read method with area parameter.
"""
@classmethod
def setUpClass(self):
jfile = opj_data_file('input/conformance/p1_04.j2k')
self.j2k = Jp2k(jfile)
self.j2k_data = self.j2k.read()
self.j2k_half_data = self.j2k.read(rlevel=1)
self.j2k_quarter_data = self.j2k.read(rlevel=2)
jfile = opj_data_file('input/conformance/p1_06.j2k') jfile = opj_data_file('input/conformance/p1_06.j2k')
jp2k = Jp2k(jfile) self.j2k_p1_06 = Jp2k(jfile)
ssdata = jp2k.read(area=(9, 9, 12, 12), rlevel=1)
self.assertEqual(ssdata.shape, (1, 1, 3)) def test_NR_DEC_p1_04_j2k_43_decode(self):
actual = self.j2k.read(area=(0, 0, 1024, 1024))
expected = self.j2k_data
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_44_decode(self):
actual = self.j2k.read(area=(640, 512, 768, 640))
expected = self.j2k_data[640:768, 512:640]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_45_decode(self):
actual = self.j2k.read(area=(896, 896, 1024, 1024))
expected = self.j2k_data[896:1024, 896:1024]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_46_decode(self):
actual = self.j2k.read(area=(500, 100, 800, 300))
expected = self.j2k_data[500:800, 100:300]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_47_decode(self):
actual = self.j2k.read(area=(520, 260, 600, 360))
expected = self.j2k_data[520:600, 260:360]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_48_decode(self):
actual = self.j2k.read(area=(520, 260, 660, 360))
expected = self.j2k_data[520:660, 260:360]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_49_decode(self):
actual = self.j2k.read(area=(520, 360, 600, 400))
expected = self.j2k_data[520:600, 360:400]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_50_decode(self):
actual = self.j2k.read(area=(0, 0, 1024, 1024), rlevel=2)
expected = self.j2k_quarter_data
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_51_decode(self):
actual = self.j2k.read(area=(640, 512, 768, 640), rlevel=2)
expected = self.j2k_quarter_data[160:192, 128:160]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_52_decode(self):
actual = self.j2k.read(area=(896, 896, 1024, 1024), rlevel=2)
expected = self.j2k_quarter_data[224:352, 224:352]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_53_decode(self):
actual = self.j2k.read(area=(500, 100, 800, 300), rlevel=2)
expected = self.j2k_quarter_data[125:200, 25:75]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_54_decode(self):
actual = self.j2k.read(area=(520, 260, 600, 360), rlevel=2)
expected = self.j2k_quarter_data[130:150, 65:90]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_55_decode(self):
actual = self.j2k.read(area=(520, 260, 660, 360), rlevel=2)
expected = self.j2k_quarter_data[130:165, 65:90]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_04_j2k_56_decode(self):
actual = self.j2k.read(area=(520, 360, 600, 400), rlevel=2)
expected = self.j2k_quarter_data[130:150, 90:100]
np.testing.assert_array_equal(actual, expected)
def test_NR_DEC_p1_06_j2k_70_decode(self):
actual = self.j2k_p1_06.read(area=(9, 9, 12, 12), rlevel=1)
self.assertEqual(actual.shape, (1, 1, 3))
def test_NR_DEC_p1_06_j2k_71_decode(self): def test_NR_DEC_p1_06_j2k_71_decode(self):
jfile = opj_data_file('input/conformance/p1_06.j2k') actual = self.j2k_p1_06.read(area=(10, 4, 12, 10), rlevel=1)
jp2k = Jp2k(jfile) self.assertEqual(actual.shape, (1, 3, 3))
ssdata = jp2k.read(area=(10, 4, 12, 10), rlevel=1)
self.assertEqual(ssdata.shape, (1, 3, 3))
def test_NR_DEC_p1_06_j2k_72_decode(self): def test_NR_DEC_p1_06_j2k_72_decode(self):
jfile = opj_data_file('input/conformance/p1_06.j2k') ssdata = self.j2k_p1_06.read(area=(3, 3, 9, 9), rlevel=1)
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(3, 3, 9, 9), rlevel=1)
self.assertEqual(ssdata.shape, (3, 3, 3)) self.assertEqual(ssdata.shape, (3, 3, 3))
def test_NR_DEC_p1_06_j2k_73_decode(self): def test_NR_DEC_p1_06_j2k_73_decode(self):
jfile = opj_data_file('input/conformance/p1_06.j2k') ssdata = self.j2k_p1_06.read(area=(4, 4, 7, 7), rlevel=1)
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(4, 4, 7, 7), rlevel=1)
self.assertEqual(ssdata.shape, (2, 2, 3)) self.assertEqual(ssdata.shape, (2, 2, 3))
def test_NR_DEC_p1_06_j2k_74_decode(self): def test_NR_DEC_p1_06_j2k_74_decode(self):
jfile = opj_data_file('input/conformance/p1_06.j2k') ssdata = self.j2k_p1_06.read(area=(4, 4, 5, 5), rlevel=1)
jp2k = Jp2k(jfile)
ssdata = jp2k.read(area=(4, 4, 5, 5), rlevel=1)
self.assertEqual(ssdata.shape, (1, 1, 3)) self.assertEqual(ssdata.shape, (1, 1, 3))
def test_NR_DEC_p1_06_j2k_75_decode(self): def test_NR_DEC_p1_06_j2k_75_decode(self):
# Image size would be 0 x 0. # Image size would be 0 x 0.
jfile = opj_data_file('input/conformance/p1_06.j2k')
jp2k = Jp2k(jfile)
with self.assertRaises((IOError, OSError)): with self.assertRaises((IOError, OSError)):
jp2k.read(area=(9, 9, 12, 12), rlevel=2) self.j2k_p1_06.read(area=(9, 9, 12, 12), rlevel=2)
def test_NR_DEC_p0_04_j2k_85_decode(self): def test_NR_DEC_p0_04_j2k_85_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(0, 0, 256, 256))
jp2k = Jp2k(jfile) expected = self.j2k_data[:256, :256]
ssdata = jp2k.read(area=(0, 0, 256, 256)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[0:256, 0:256], ssdata)
def test_NR_DEC_p0_04_j2k_86_decode(self): def test_NR_DEC_p0_04_j2k_86_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(0, 128, 128, 256))
jp2k = Jp2k(jfile) expected = self.j2k_data[:128, 128:256]
ssdata = jp2k.read(area=(0, 128, 128, 256)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[0:128, 128:256], ssdata)
def test_NR_DEC_p0_04_j2k_87_decode(self): def test_NR_DEC_p0_04_j2k_87_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(10, 50, 200, 120))
jp2k = Jp2k(jfile) expected = self.j2k_data[10:200, 50:120]
ssdata = jp2k.read(area=(10, 50, 200, 120)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[10:200, 50:120], ssdata)
def test_NR_DEC_p0_04_j2k_88_decode(self): def test_NR_DEC_p0_04_j2k_88_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(150, 10, 210, 190))
jp2k = Jp2k(jfile) expected = self.j2k_data[150:210, 10:190]
ssdata = jp2k.read(area=(150, 10, 210, 190)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[150:210, 10:190], ssdata)
def test_NR_DEC_p0_04_j2k_89_decode(self): def test_NR_DEC_p0_04_j2k_89_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(80, 100, 150, 200))
jp2k = Jp2k(jfile) expected = self.j2k_data[80:150, 100:200]
ssdata = jp2k.read(area=(80, 100, 150, 200)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[80:150, 100:200], ssdata)
def test_NR_DEC_p0_04_j2k_90_decode(self): def test_NR_DEC_p0_04_j2k_90_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(20, 150, 50, 200))
jp2k = Jp2k(jfile) expected = self.j2k_data[20:50, 150:200]
ssdata = jp2k.read(area=(20, 150, 50, 200)) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read()
np.testing.assert_array_equal(fulldata[20:50, 150:200], ssdata)
def test_NR_DEC_p0_04_j2k_91_decode(self): def test_NR_DEC_p0_04_j2k_91_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(0, 0, 256, 256), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[0:64, 0:64]
ssdata = jp2k.read(area=(0, 0, 256, 256), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[0:64, 0:64], ssdata)
def test_NR_DEC_p0_04_j2k_92_decode(self): def test_NR_DEC_p0_04_j2k_92_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(0, 128, 128, 256), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[:32, 32:64]
ssdata = jp2k.read(area=(0, 128, 128, 256), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[0:32, 32:64], ssdata)
def test_NR_DEC_p0_04_j2k_93_decode(self): def test_NR_DEC_p0_04_j2k_93_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(10, 50, 200, 120), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[3:50, 13:30]
ssdata = jp2k.read(area=(10, 50, 200, 120), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[3:50, 13:30], ssdata)
def test_NR_DEC_p0_04_j2k_94_decode(self): def test_NR_DEC_p0_04_j2k_94_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(150, 10, 210, 190), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[38:53, 3:48]
ssdata = jp2k.read(area=(150, 10, 210, 190), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[38:53, 3:48], ssdata)
def test_NR_DEC_p0_04_j2k_95_decode(self): def test_NR_DEC_p0_04_j2k_95_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(80, 100, 150, 200), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[20:38, 25:50]
ssdata = jp2k.read(area=(80, 100, 150, 200), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[20:38, 25:50], ssdata)
def test_NR_DEC_p0_04_j2k_96_decode(self): def test_NR_DEC_p0_04_j2k_96_decode(self):
jfile = opj_data_file('input/conformance/p0_04.j2k') actual = self.j2k.read(area=(20, 150, 50, 200), rlevel=2)
jp2k = Jp2k(jfile) expected = self.j2k_quarter_data[5:13, 38:50]
ssdata = jp2k.read(area=(20, 150, 50, 200), rlevel=2) np.testing.assert_array_equal(actual, expected)
fulldata = jp2k.read(rlevel=2)
np.testing.assert_array_equal(fulldata[5:13, 38:50], ssdata)
if __name__ == "__main__":
unittest.main()