From 89a1b0bb1c6b812f82805a3bb3488051ec40045f Mon Sep 17 00:00:00 2001 From: John Evans Date: Tue, 11 Nov 2014 10:46:59 -0500 Subject: [PATCH] progress, working on rlevel --- glymur/jp2k.py | 52 ++++++++++++++++++++++++++++------------ glymur/test/test_jp2k.py | 46 ++++++++++++++++++++--------------- 2 files changed, 64 insertions(+), 34 deletions(-) diff --git a/glymur/jp2k.py b/glymur/jp2k.py index f36b75e..25efacd 100644 --- a/glymur/jp2k.py +++ b/glymur/jp2k.py @@ -60,6 +60,23 @@ class Jp2k(Jp2kBox): List of top-level boxes in the file. Each box may in turn contain its own list of boxes. Will be empty if the file consists only of a raw codestream. + + Examples + -------- + >>> import glymur + >>> jfile = glymur.data.nemo() + >>> jp2 = glymur.Jp2k(jfile) + >>> jp2.shape + (1456, 2592, 3) + >>> image = jp2[:] + >>> image.shape + (1456, 2592, 3) + + Read a lower resolution thumbnail. + + >>> thumbnail = jp2[::2, ::2] + >>> thumbnail.shape + (728, 1296, 3) """ def __init__(self, filename, mode='rb'): @@ -957,6 +974,25 @@ class Jp2k(Jp2kBox): return data[:, :, bands] + def _read(self): + """Read a JPEG 2000 image. + + Returns + ------- + img_array : ndarray + The image data. + + Raises + ------ + IOError + If the image has differing subsample factors. + """ + if version.openjpeg_version_tuple[0] < 2: + img = self._read_openjpeg(**kwargs) + else: + img = self._read_openjp2(**kwargs) + return img + def read(self, **kwargs): """Read a JPEG 2000 image. @@ -988,22 +1024,8 @@ class Jp2k(Jp2kBox): ------ IOError If the image has differing subsample factors. - - Examples - -------- - >>> import glymur - >>> jfile = glymur.data.nemo() - >>> jp = glymur.Jp2k(jfile) - >>> image = jp.read() - >>> image.shape - (1456, 2592, 3) - - Read the lowest resolution thumbnail. - - >>> thumbnail = jp.read(rlevel=-1) - >>> thumbnail.shape - (728, 1296, 3) """ + warnings.warn("Use array-style slicing instead.", DeprecationWarning) if version.openjpeg_version_tuple[0] < 2: img = self._read_openjpeg(**kwargs) else: diff --git a/glymur/test/test_jp2k.py b/glymur/test/test_jp2k.py index 9a9fb72..4933777 100644 --- a/glymur/test/test_jp2k.py +++ b/glymur/test/test_jp2k.py @@ -67,11 +67,13 @@ class SliceProtocolBase(unittest.TestCase): def setUpClass(self): self.jp2 = Jp2k(glymur.data.nemo()) - self.jp2_data = self.jp2.read() + self.jp2_data = self.jp2[:] + self.jp2_data_r1 = self.jp2[::2, ::2] self.j2k = Jp2k(glymur.data.goodstuff()) - self.j2k_data = self.j2k.read() + self.j2k_data = self.j2k[:] + self.j2k_data_r1 = self.j2k[::2, ::2] @unittest.skipIf(os.name == "nt", fixtures.WINDOWS_TMP_FILE_MSG) class TestSliceProtocolBaseWrite(SliceProtocolBase): @@ -82,7 +84,7 @@ class TestSliceProtocolBaseWrite(SliceProtocolBase): with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: j = Jp2k(tfile.name, 'wb') j[...] = self.j2k_data - actual = j.read() + actual = j[:] np.testing.assert_array_equal(actual, expected) @@ -92,7 +94,7 @@ class TestSliceProtocolBaseWrite(SliceProtocolBase): with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: j = Jp2k(tfile.name, 'wb') j[:] = self.j2k_data - actual = j.read() + actual = j[:] np.testing.assert_array_equal(actual, expected) @@ -167,9 +169,9 @@ class TestSliceProtocolRead(SliceProtocolBase): 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) + actual = self.j2k[::2, ::2, 1:3] + expected = self.j2k_data_r1[:, :, 1:3] + np.testing.assert_array_equal(actual, expected) def test_retrieve_single_row(self): actual = self.jp2[0] @@ -231,24 +233,24 @@ class TestSliceProtocolRead(SliceProtocolBase): expected = self.jp2_data[728:, :] np.testing.assert_array_equal(actual, expected) - def test_region_rlevel1(self): + def test_region_rlevel1_odd(self): actual = self.jp2[0:201:2, 0:201:2] - expected = self.jp2.read(area=(0, 0, 201, 201), rlevel=1) + expected = self.jp2_data_r1[:101, :101, :] + np.testing.assert_array_equal(actual, expected) + + def test_region_rlevel1_even(self): + actual = self.jp2[0:202:2, 0:202:2] + expected = self.jp2_data_r1[:101, :101, :] 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) + expected = self.jp2_data_r1[:101, :101, :] 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) + expected = self.jp2_data_r1[101:, 101:, :] np.testing.assert_array_equal(actual, expected) def test_ellipsis_full_read(self): @@ -476,6 +478,12 @@ class TestJp2k(unittest.TestCase): def tearDown(self): pass + @unittest.skipIf(WARNING_INFRASTRUCTURE_ISSUE, WARNING_INFRASTRUCTURE_MSG) + def test_warn_if_using_read_method(self): + """Should warn if read method is called""" + with self.assertWarns(DeprecationWarning): + Jp2k(self.jp2file).read() + def test_shape_jp2(self): """verify shape attribute for JP2 file """ @@ -519,7 +527,7 @@ class TestJp2k(unittest.TestCase): def test_irreversible(self): """Irreversible""" j = Jp2k(self.jp2file) - expdata = j.read() + expdata = j[:] with tempfile.NamedTemporaryFile(suffix='.j2k') as tfile: j2 = Jp2k(tfile.name, 'wb') j2.write(expdata, irreversible=True) @@ -528,7 +536,7 @@ class TestJp2k(unittest.TestCase): self.assertEqual(codestream.segment[2].spcod[8], glymur.core.WAVELET_XFORM_9X7_IRREVERSIBLE) - actdata = j2.read() + actdata = j2[:] self.assertTrue(fixtures.mse(actdata[0], expdata[0]) < 0.38) @unittest.skipIf(re.match('1.[0-4]', openjpeg_version) is not None, @@ -538,7 +546,7 @@ class TestJp2k(unittest.TestCase): def test_no_cxform_pclr_jpx(self): """Indices for pclr jpxfile if no color transform""" j = Jp2k(self.jpxfile) - rgb = j.read() + rgb = j[:] idx = j.read(ignore_pclr_cmap_cdef=True) nr, nc = 1024, 1024 self.assertEqual(rgb.shape, (nr, nc, 3))