docs: def _extract_image(self, raw_image):
          """
          Extract unequally-sized image bands.
  
          Parameters
          ----------
          raw_image : reference to openjpeg ImageType instance
              The image structure initialized with image characteristics.
  
          Returns
          -------
          list or ndarray
              If the JPEG 2000 image has unequally-sized components, they are
              extracted into a list, otherwise a numpy array.
  
          """
          ncomps = raw_image.contents.numcomps
  
          # Make a pass thru the image, see if any of the band datatypes or
          # dimensions differ.
          dtypes, nrows, ncols = [], [], []
          for k in range(raw_image.contents.numcomps):
              component = raw_image.contents.comps[k]
              dtypes.append(self._component2dtype(component))
              nrows.append(component.h)
              ncols.append(component.w)
          is_cube = all(r == nrows[0] and c == ncols[0] and d == dtypes[0]
                        for r, c, d in zip(nrows, ncols, dtypes))
  
          if is_cube:
              image = np.zeros((nrows[0], ncols[0], ncomps), dtypes[0])
          else:
              image = []
  
          for k in range(raw_image.contents.numcomps):
              component = raw_image.contents.comps[k]
  
              self._validate_nonzero_image_size(nrows[k], ncols[k], k)
  
              addr = ctypes.addressof(component.data.contents)
              with warnings.catch_warnings():
                  warnings.simplefilter("ignore")
                  nelts = nrows[k] * ncols[k]
                  band = np.ctypeslib.as_array(
                      (ctypes.c_int32 * nelts).from_address(addr))
                  if is_cube:
                      image[:, :, k] = np.reshape(band.astype(dtypes[k]),
                                                  (nrows[k], ncols[k]))
                  else:
                      image.append(np.reshape(band.astype(dtypes[k]),
                                   (nrows[k], ncols[k])))
  
          if is_cube and image.shape[2] == 1:
              # The third dimension has just a single layer.  Make the image
              # data 2D instead of 3D.
              image.shape = image.shape[0:2]
  
          return image