Added single pixel and component retrieval.
This commit is contained in:
parent
7f60811135
commit
27b67113bc
2 changed files with 27 additions and 7 deletions
|
|
@ -766,6 +766,7 @@ class Jp2k(Jp2kBox):
|
||||||
codestream = self.get_codestream(header_only=True)
|
codestream = self.get_codestream(header_only=True)
|
||||||
if isinstance(pargs, int):
|
if isinstance(pargs, int):
|
||||||
# Not a very good use of this protocol, but technically legal.
|
# Not a very good use of this protocol, but technically legal.
|
||||||
|
# This retrieves a single row.
|
||||||
row = pargs
|
row = pargs
|
||||||
area = (row, 0, row + 1, codestream.segment[1].xsiz)
|
area = (row, 0, row + 1, codestream.segment[1].xsiz)
|
||||||
|
|
||||||
|
|
@ -773,16 +774,25 @@ class Jp2k(Jp2kBox):
|
||||||
return self.read(area=area).squeeze()
|
return self.read(area=area).squeeze()
|
||||||
|
|
||||||
if isinstance(pargs, slice):
|
if isinstance(pargs, slice):
|
||||||
# Case of jp2[:]
|
# 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
|
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.")
|
|
||||||
|
|
||||||
# Assuming pargs is a tuple from now on.
|
if isinstance(pargs, tuple) and all(isinstance(x, int) for x in pargs):
|
||||||
|
# Retrieve a single pixel.
|
||||||
|
# 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 len(pargs) == 2:
|
||||||
|
return pixel
|
||||||
|
elif len(pargs) == 3:
|
||||||
|
return pixel[pargs[2]]
|
||||||
|
|
||||||
|
# Assuming pargs is a tuple of slices from now on.
|
||||||
rows = pargs[0]
|
rows = pargs[0]
|
||||||
cols = pargs[1]
|
cols = pargs[1]
|
||||||
if len(pargs) == 2:
|
if len(pargs) == 2:
|
||||||
|
|
|
||||||
|
|
@ -100,6 +100,16 @@ class TestSliceProtocol(unittest.TestCase):
|
||||||
expected = self.jp2_data[0]
|
expected = self.jp2_data[0]
|
||||||
np.testing.assert_array_equal(actual, expected)
|
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):
|
def test_full_resolution_slicing_by_quarters_upper_left(self):
|
||||||
actual = self.jp2[:728, :1296]
|
actual = self.jp2[:728, :1296]
|
||||||
expected = self.jp2_data[:728, :1296]
|
expected = self.jp2_data[:728, :1296]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue