Your understanding is correct, however I cannot use GetScalarComponentAsDouble and SetScalarComponentAsDouble because they are way too slow in Java. Do you have any other suggestions for how to do this or will I have to write it myself in C++?<br>
<br><div class="gmail_quote">On Fri, Mar 25, 2011 at 12:29 PM, David Gobbi <span dir="ltr"><<a href="mailto:david.gobbi@gmail.com">david.gobbi@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Jonathan,<br>
<br>
If I understand correctly, you have several binary images with exactly<br>
the same dimensions. And you want to collapse them into a single<br>
image, by storing a bitfield in the pixels of that image. So:<br>
<br>
To set bit "i" in pixel "xyz" (C++ code):<br>
int a = int(image.GetScalarComponentAsDouble(x, y, z, 0));<br>
a |= (1 << i);<br>
image.SetScalarComponentAsDouble(x, y, z, a);<br>
<br>
To clear bit "i" in pixel "xyz":<br>
int a = int(image.GetScalarComponentAsDouble(x, y, z, 0));<br>
a &= ~(1 << i);<br>
image.SetScalarComponentAsDouble(x, y, z, a);<br>
<br>
To test bit "i" in pixel "xyz":<br>
int a = int(image.GetScalarComponentAsDouble(x, y, z, 0));<br>
return ((a >> i) & 1);<br>
<br>
But I'm not sure if this is what you are trying to do. I didn't fully<br>
understand your pseudocode.<br>
<br>
- David<br>
<div><div></div><div class="h5"><br>
<br>
<br>
On Fri, Mar 25, 2011 at 1:08 PM, Jonathan Morra <<a href="mailto:jonmorra@gmail.com">jonmorra@gmail.com</a>> wrote:<br>
> I'm in Java and storing a large number of binary vtkImageData's. I know<br>
> this is inefficient, and am searching for a better way to store them. Right<br>
> now I have a hash of the vtkImageData's and a get/put function. Basically I<br>
> want to mimic this get/put but with better storage. I was thinking one way<br>
> to do this is to use bitwise logical operations to store the information in<br>
> the binary masks. For instance, if we have 2 binary images, then we could<br>
> store that information in 1 vtkImageData using the following pseudo code.<br>
> private static final int IMAGE1_BIT_CHANNEL = 0;<br>
> private static final int IMAGE2_BIT_CHANNEL = 1;<br>
> private vtkImageData storedImage;<br>
> vtkImageData get(String image) {<br>
> int channel = image eq "image1" ? IMAGE1_BIT_CHANNEL :<br>
> IMAGE2_BIT_CHANNEL;<br>
> vtkImageData return = new vtkImageData();<br>
> foreach (pixel in storedImage)<br>
> if (pixel at bit channel)<br>
> return[pixel] = 1;<br>
> else<br>
> return[pixel] = 0;<br>
> return return;<br>
> }<br>
> void put(String image, vtkImageData binaryImage) {<br>
> int channel = image eq "image1" ? IMAGE1_BIT_CHANNEL :<br>
> IMAGE2_BIT_CHANNEL;<br>
> foreach (pixel in binaryImage)<br>
> if (pixel)<br>
> storedImage at bit in channel = 1;<br>
> else<br>
> storedImage at bit in channel = 0;<br>
> }<br>
> This could be extended easily for 8 channels for a char image for instance.<br>
> This operation would have to be very fast though cause it is done often on<br>
> the UI thread.<br>
> 1. Is there a way to do this in VTK with Java?<br>
> 2. Is this the best scheme for accomplishing my goal?<br>
> 3. Is there a better scheme for doing this?<br>
> Thanks.<br>
</div></div>> _______________________________________________<br>
> Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
><br>
> Visit other Kitware open-source projects at<br>
> <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
><br>
> Please keep messages on-topic and check the VTK FAQ at:<br>
> <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
><br>
> Follow this link to subscribe/unsubscribe:<br>
> <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
><br>
><br>
</blockquote></div><br>