imi-bigpicture / wsidicomizer

Python library for converting WSI files to DICOM
Apache License 2.0
54 stars 7 forks source link

wsidicomizer does not work with numpy release 1.25 for some formats #75

Closed fhnaumann closed 1 year ago

fhnaumann commented 1 year ago

When converting the openslide sample data for the Leica SCN format, I encountered an error which I didn't have some time ago. After some testing I can confirm (at least for Leica SCN format) that the exception is caused with numpy relase 1.25. Using numpy version 1.24.3 works fine and generates the dicom files. Running wsidicomizer -i "Leica SCN.tiff" -o . I get the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/wsidicomizer", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.10/site-packages/wsidicomizer/cli.py", line 320, in main
    WsiDicomizer.convert(
  File "/usr/local/lib/python3.10/site-packages/wsidicomizer/wsidicomizer.py", line 242, in convert
    created_files = wsi.save(
  File "/usr/local/lib/python3.10/site-packages/wsidicom/wsidicom.py", line 579, in save
    target.save_levels(self.levels)
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_target.py", line 87, in save_levels
    self._save_group(level, scale)
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_target.py", line 145, in _save_group
    wsi_file.write(
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_writer.py", line 104, in write
    frame_positions += self._write_pixel_data(
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_writer.py", line 424, in _write_pixel_data
    return [
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_writer.py", line 424, in <listcomp>
    return [
  File "/usr/local/lib/python3.10/concurrent/futures/_base.py", line 621, in result_iterator
    yield _result_or_cancel(fs.pop())
  File "/usr/local/lib/python3.10/concurrent/futures/_base.py", line 319, in _result_or_cancel
    return fut.result(timeout)
  File "/usr/local/lib/python3.10/concurrent/futures/_base.py", line 458, in result
    return self.__get_result()
  File "/usr/local/lib/python3.10/concurrent/futures/_base.py", line 403, in __get_result
    raise self._exception
  File "/usr/local/lib/python3.10/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/usr/local/lib/python3.10/site-packages/wsidicom/file/wsidicom_file_writer.py", line 394, in get_tiles_thread
    return image_data.get_encoded_tiles(tile_points, z, path)
  File "/usr/local/lib/python3.10/site-packages/wsidicom/instance/image_data.py", line 221, in get_encoded_tiles
    return [self._get_encoded_tile(tile, z, path) for tile in tiles]
  File "/usr/local/lib/python3.10/site-packages/wsidicom/instance/image_data.py", line 221, in <listcomp>
    return [self._get_encoded_tile(tile, z, path) for tile in tiles]
  File "/usr/local/lib/python3.10/site-packages/wsidicomizer/sources/tiffslide/tiffslide_image_data.py", line 420, in _get_encoded_tile
    tile = self._get_region(Region(tile_point * self.tile_size, self.tile_size))
  File "/usr/local/lib/python3.10/site-packages/wsidicomizer/sources/tiffslide/tiffslide_image_data.py", line 393, in _get_region
    if self._detect_blank_tile(region_data):
  File "/usr/local/lib/python3.10/site-packages/wsidicomizer/sources/tiffslide/tiffslide_image_data.py", line 321, in _detect_blank_tile
    if np.all(data[corners_rgb] == background):
ValueError: operands could not be broadcast together with shapes (4,4,2) (3,)

Dependencies:

erikogabrielsson commented 1 year ago

Thanks for the report @wand555.

It looks like the error comes from this numpy evaluation::

corners_rgb = np.ix_(CORNERS_X, CORNERS_Y, range(TRANSPARENCY))
if np.all(data[corners_rgb] == background):
    ...

With the numpy version I have this raises a warning:

 DeprecationWarning: elementwise comparison failed; this will raise an error in the future.

Changing corners_rgb to:

corners_rgb = np.ix_(CORNERS_X, CORNERS_Y)

Looks to fix the issue. Will make some tests to ensure that this is correct.

fhnaumann commented 1 year ago

Thanks. For now I will stick with using an older numpy version until you do a new release.

erikogabrielsson commented 1 year ago

This issue is fixed in #78 .