← 返回首页
add `ImageVolumeGraphic` by kushalkolar · Pull Request #791 · fastplotlib/fastplotlib · GitHub
Skip to content

Navigation Menu

Toggle navigation
Sign in
Appearance settings
Search or jump to...

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
Resetting focus

add ImageVolumeGraphic#791

Merged
clewis7 merged 57 commits into
mainfrom
volume-image
Oct 1, 2025
Merged

add ImageVolumeGraphic#791
clewis7 merged 57 commits into
mainfrom
volume-image

Conversation

kushalkolar commented Apr 12, 2025
edited
Loading

Copy link
Copy Markdown
Member

actually going to merge it this time

  • TextureArrays supports 3D textures
  • implement simple ImageVolumeGraphic
  • implement graphic features for all the different volume materials
  • check and document sharing the data buffer between an object that uses mip/ray material and another object that uses slice material.
  • examples
    • basic for all material types
    • 3D video, maybe generated calcium toy data?
    • multi channel zarr
  • make hlut tool work with this, account for the dims so that the cmap bar shows up
  • make this work with ImageWidget, image widget is a mess, need to refactor iw before adding volume support
  • tests: screenshots, API, new graphic, TextureArray for 2d and 3d, and any new graphic features.
  • test multi-channel
  • fix some typos in graphics.image
  • scripts/generate_add_graphic_methods.py is better, removed Graphic.type attribute which was only used in the generate mixin script and use regex instead to create the add_<graphic> method names.
  • improve docstring for quick_min_max()

@almarklein are RGB volumes supported? Is it even a thing?

selector tools for slicing, cube slicing, etc., non-orthogonal slicing to come later

note: implementing ImageVolumeGraphic as a subclass of ImageGraphic wasn't a good idea because the __init__ gets messy. Might make a BaseImageGraphic class which just has properties which are almost identical between ImageGraphic and ImageVolumeGraphic, but not a big deal right now.

kushalkolar requested a review from clewis7 as a code owner April 12, 2025 06:20
kushalkolar mentioned this pull request Apr 12, 2025

Copy link
Copy Markdown
Member Author

took some 3d movie gen code from caiman to generate a 3d movie:

@FlynnOConnell

3d-2025-04-12_03.09.08.mp4

Copy link
Copy Markdown
Collaborator
File [~\repos\fastplotlib\fastplotlib\graphics\features\_image.py:147](http://localhost:8888/lab/tree/demos/notebooks/~/repos/fastplotlib/fastplotlib/graphics/features/_image.py#line=146), in TextureArray._fix_data(self, data) 145 def _fix_data(self, data): 146 if data.ndim not in (2, 3): --> 147 raise ValueError( 148 "image data must be 2D with or without an RGB(A) dimension, i.e. " 149 "it must be of shape [rows, cols], [rows, cols, 3] or [rows, cols, 4]" 150 ) 152 # let's just cast to float32 always 153 return data.astype(np.float32) ValueError: image data must be 2D with or without an RGB(A) dimension, i.e. it must be of shape [rows, cols], [rows, cols, 3] or [rows, cols, 4]
data = np.random.randn(50, 2, 448, 448) data.shape >> (50, 2, 448, 448)

The ability to view a time-series with a 4th dimension would be nice here

Copy link
Copy Markdown
Collaborator

Also how difficult is something like scale=[1, 4, 1] to account for anisotropy in XY and Z? Here I have a volume of [14, 448, 448] ZXY, but from the side its a flat plane. This dataset is [2um x 2um x 17um]

Copy link
Copy Markdown
Collaborator

Also how difficult is something like scale=[1, 4, 1] to account for anisotropy in XY and Z? Here I have a volume of [14, 448, 448] ZXY, but from the side its a flat plane. This dataset is [2um x 2um x 17um]

nevermind :)

volume.world_object.world.scale_z = 15.0

Some other helpful tidbits:

hlut = fpl.HistogramLUTTool(volume.data.value, volume) volume.interpolation = "linear" volume.cmap = "gnuplot2" fig[0, 0].docks["right"].add_graphic(hlut) fig[0, 0].docks["right"].size = 80
fig[0, 0].docks["right"].controller.enabled = False fig[0, 0].docks["right"].camera.maintain_aspect = False fig[0, 0].docks["right"].auto_scale(maintain_aspect=False)

Copy link
Copy Markdown
Collaborator

@almarklein are RGB volumes supported? Is it even a thing?

Yes, looks like it is; it uses the same logic (in the shader) as the image. I have never encountered it in the wild though.

kushalkolar mentioned this pull request Apr 17, 2025
78 tasks
kushalkolar marked this pull request as draft June 4, 2025 04:58

Copy link
Copy Markdown
Member Author

ok all the basics are down, switchable materials, can change material props:

vol-2025-06-04_03.34.28.mp4

Need to figure out why regex is turning VolumeSliceMaterial into slic instead of slice

Copy link
Copy Markdown
Member Author

In other news, the latest pycharm is full of bugs, wtf is this. Also it wanted to auto insert the old rst structured docstring template even though I configured it to do numpydoc format 🤮

kushalkolar commented Jun 5, 2025
edited
Loading

Copy link
Copy Markdown
Member Author

All that's left is tests, 2D over time example, and RGB(A) examples. I also think I want to merge #849 and then rebase this so the examples will be much simpler.

Also pygfx has non-orthogonal slicing:

vol_slicing-2025-06-05_00.53.40.mp4

Copy link
Copy Markdown
Member Author

ok there's a bug in the TextureArray or tiling somewhere, because when a dim is greater than the limit it is tiling along the wrong dim 😆

Copy link
Copy Markdown
Member Author

The rendering at the edges is weird if one of the dims is larger than the 3d texture size limit so let's just not support this, I think the uses are very much rare edge cases. Also if the 3d texture size limit is 16,383, then 16384x16384x16384 with float32 is 17 TB which is more than any GPU that I know of can handle 😂 .

25 hidden items Load more…

github-actions Bot commented Sep 28, 2025
edited
Loading

Copy link
Copy Markdown

📚 Docs preview built and uploaded! https://www.fastplotlib.org/ver/volume-image

Copy link
Copy Markdown
Member Author

More tests for the TextureArray for volumes would be nice, but can do that later. I think tiling of volume is a rare edge case so if there is a bug it will affect very rare usecases not already covered by the tests.

clewis7 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Choose a reason Spam Abuse Off Topic Outdated Duplicate Resolved Low Quality Hide comment

Just some small comments, otherwise looks good to me

Very cool stuff!

Comment thread examples/image_volume/image_volume_mip.py Outdated Show resolved Hide resolved
Comment thread fastplotlib/graphics/features/_volume.py Outdated Show resolved Hide resolved
Comment thread fastplotlib/graphics/features/_volume.py Outdated Show resolved Hide resolved
Comment thread fastplotlib/graphics/image_volume.py Outdated Show resolved Hide resolved

Copy link
Copy Markdown
Collaborator

Amazing! @kushalkolar I'll test this out!

kushalkolar commented Oct 1, 2025
edited
Loading

Copy link
Copy Markdown
Member Author

@clewis7 gtg! 🥳 and then we can merge #904 once I make new ground truth screenshots for that and then #883

Hide details View details clewis7 merged commit 5a9b829 into main Oct 1, 2025
40 of 52 checks passed
clewis7 deleted the volume-image branch October 1, 2025 15:38
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

Footer

© 2026 GitHub, Inc.