You are fantastic. Thanks for the explanation. I will try and work out these values by hand using the explanation you gave me and hopefully make sense of the result!<br><br>Thank you so much!<br><br>Luca<br><br><div><span class="gmail_quote">
On 9/19/07, <b class="gmail_sendername">David Gobbi</b> <<a href="mailto:david.gobbi@gmail.com">david.gobbi@gmail.com</a>> wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Hi Luca,<br><br>The equations for bilinear interpolation are easy. Let's say that you<br>want to interpolate a value at (x,y). First thing the algorithm does is<br>calculate (i,j) = (floor(x), floor(y)) to find the indices of a pixel in the
<br>original image. Then it calculates fx = x-i and fy = y-j, and uses these to<br>compute interpolation weights for the four voxels surrounding (x,y),<br>so that it can give you v(x,y) which is the value of the new pixel:
<br><br>v(x,y) = (1-fx)(1-fy)*v(i,j) + (1-fx)(fy)*v(i,j+1) +<br>(fx)(1-fy)*v(i+1,j) + (fx)(fy)*v(i+1,j+1)<br><br>The reason that your results are odd must be due to the way that (x,y)<br>is calculated. For the simple vtkImageReslice example that I gave in
<br>my previous email, the x values at which the new pixel are interpolated are<br>x = [0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4]<br><br>It's just my guess by looking at your numbers, that for you the x values are<br>x = [-0.25
, 0.25, 0.75, 1.25, 1.75, 2.25, 2.75, 3.25, 3.75, 4.25]<br><br>I don't want to get too technical here, but both of the above sets of x values<br>are correct if you want to get a zoom factor of 2.0. Which of the two<br>
behaviours<br>you want depends on how you want edges to be handled.<br><br>The first behaviour (averaging the neighboring pixels) is what you want if<br>you are expanding a 5x5 image to create a 9x9 image. As for why you get
<br>a 9x9 image when you do averaging like this, instead of a 10x10 image,<br>that should be obvious when you think about it.<br><br>The second behaviour with all those 0.25's is what you use if you really need<br>to expand your 5x5 image into a 10x10 image. Again, let me be clear
<br>on this: both of these behaviours are giving you a zoom factor of 2.0.<br>The difference lies in how you want the edges to be handled.<br><br>So, now about edges. The edge of the image is defined as the position<br>of the center of the outermost pixels. Please note that I said the CENTER
<br>of those pixels. That is how VTK defines the edge, and this is the best<br>definition in most circumstances, so please don't argue with that definition.<br>When vtkImageReslice needs to interpolate beyond the edge of an image,
<br>(e.g. when x = -0.25) the rule that is applied is as follows<br>1) if the distance from x to the edge is less than half of the output pixel<br> spacing, then x is clamped to the edge before interpolation occurs<br>
2) if the distance is greater than half of the output pixel spacing, then<br> the output pixel is set to the background color<br>3) In vtk 4 and earlier, this "half pixel" rule doesn't apply, all out-of-bounds
<br> pixels were set to the background value until vtk 5.0<br><br>So let me quickly summarize: I think that your results are following<br>behaviour 2 as described above. Whether or not this is what you want,<br>well, that's up to you. As for why vtkImageReslice is giving you these
<br>results, I can't tell you that unless you post your code.<br><br> David<br><br><br><br>On 9/19/07, Luca Pamparana <<a href="mailto:luca.pamparana@gmail.com">luca.pamparana@gmail.com</a>> wrote:<br>> Hi David,
<br>><br>> Many many thanks for answering my question! I am really grateful.<br>><br>> Yes, you are right I see that the number of pixels generated are correct.<br>> However, I am unable to figure out what the algorithms are doing to generate
<br>> the values.<br>><br>> For example, I created a small synthetic image (unsigned char) type with the<br>> following pattern. Origin is at lower left (image dimension 5 X 5):<br>><br>> 2 3 4 5 0
<br>> 3 4 5 0 1<br>> 4 5 0 1 2<br>> 5 0 1 2 3<br>> 0 1 2 3 4
<br>><br>> switched to linear interpolation with the image and on zooming by a factor<br>> of 2, I get the following pixel blocks:<br>><br>> 2 2 3 3 4 4 5 4 1
<br>> 0<br>> 3 3 3 4 4 4 3 2 1<br>> 1<br>> 3 3 4 4 5 4 1 0 1<br>> 1<br>> 4 4 4 4 3 2 1 1 1
<br>> 2<br>> 4 4 5 4 1 0 1 1 2<br>> 2<br>> 5 4 3 2 1 1 1 2 2<br>> 3<br>> 5 4 1 0 1 1 2 2 3
<br>> 3<br>> 3 2 1 1 1 2 2 3 3<br>> 4<br>> 0 0 1 1 2 2 3 3 4<br>> 4<br>> 0 0 1 1 2 2 3 3 4
<br>> 4<br>><br>> What I want to know is how this is calculated? Could you, by any chance,<br>> tell me the formula and the process as which pixels are considered when<br>> calculating the intermediate values and what happens with the edge pixels? I
<br>> see the first two rows are exactly the same.<br>><br>> Also, what about cubic interpolation? Is it something similar as well?<br>><br>> I am attaching an image of the output, so you can see the pixel blocks. If
<br>> you load it in GIMP than you can easily see each pixel and see the intensity<br>> value with the color picker tool...<br>><br>> Again, I will be really grateful for all your help.<br>><br>> Thanks,
<br>><br>> Luca<br>><br>><br>> On 9/19/07, David Gobbi < <a href="mailto:david.gobbi@gmail.com">david.gobbi@gmail.com</a>> wrote:<br>> > Hi Luca,<br>> ><br>> > To see how vtkImageReslice zooms an image by a factor of 2, you
<br>> > should be doing something like this:<br>> ><br>> > vtkPNGReader *reader = vtkPNGReader::New();<br>> > reader->SetFileName("myfile.png");<br>> > reader->SetDataSpacing(
1.0, 1.0, 1.0); // tell VTK what pixel spacing to<br>> use<br>> ><br>> > vtkImageReslice *reslice = vtkImageReslice::New();<br>> > reslice->SetInput(reader->GetOutput());<br>> > reslice->SetOutputSpacing(
0.5, 0.5, 0.5); // resample with zoom factor of<br>> 2.0<br>> ><br>> > If you write the output of this reslice to a file, you will see<br>> > exactly what you expect, i.e. a new pixel inserted between all
<br>> > the old pixels in both the vertical and horizontal directions. So if<br>> > the original image size was 100x100, the new image will be<br>> > 199x199 because 99 new pixels have been inserted in the
<br>> > horizontal and vertical directions.<br>> ><br>> > Since this is not what you are seeing, then there might be something<br>> > wrong with the way you are appying the zoom factor. If you can send
<br>> > a few lines of code that show how you are using vtkImageReslice, that<br>> > would help me to fully answer your question.<br>> ><br>> > Cheers,<br>> ><br>> > David<br>> >
<br>> ><br>> > On 9/19/07, Luca Pamparana <<a href="mailto:luca.pamparana@gmail.com">luca.pamparana@gmail.com</a>> wrote:<br>> > > Hi everyone,<br>> > ><br>> > > I had asked this question a few days back but did not receive any help.
<br>> > > Asking it again hoping someone would answer my query!<br>> > ><br>> > > Just trying to understand the linear interpolation algorithm as<br>> implemented<br>> > > in the vtkImageReslice class. I tried looking at the source code but it
<br>> is<br>> > ><br>> > > really complicated and I could not understand much :(<br>> > ><br>> > > Anyway, I am zooming my image by a factor of 2. The image is a synthetic<br>> > > image which has a thick edge going along its diagonal (the value is
<br>> changing<br>> > > from 0 to 255) and I am trying to look at how the values are<br>> interpolated in<br>> > > that region.<br>> > ><br>> > ><br>> > > One thing I noticed is that there are 2 pixels being inserted in the
<br>> > > horizontal direction. So, I get the values 255, 191, 64 and 0 (255 and 0<br>> are<br>> > > the old values and the two new values are being generated by taking a<br>> > > weighted average). Is this correct? I thought that if I zoom by a factor
<br>> of<br>> > ><br>> > > 2.0 than one pixel should be inserted between successive pixels. I am<br>> not<br>> > > sure what happens at the edge pixels though.<br>> > ><br>> > > Also, what happens in the vertical direction? I cannot really figure out
<br>> how<br>> > > this works...<br>> > ><br>> > ><br>> > > So if I have pixel values as follows:<br>> > ><br>> > > 255 0 1 2<br>> > > 0 255 0 1<br>> > >
<br>> > > How is the lienar interpolation being done on a zoom of 2.0?<br>> > ><br>> > > I would really appreciate it if someone can clarify these doubts for<br>> me....<br>> > > I have spend a lot of time trying to understand this but have not yet
<br>> been<br>> > > able to comprehend this implementation.<br>> > ><br>> > ><br>> > > Thanks,<br>> > ><br>> > > Luca<br>> > ><br>> > > _______________________________________________
<br>> > > This is the private VTK discussion list.<br>> > > Please keep messages on-topic. Check the FAQ at:<br>> > > <a href="http://www.vtk.org/Wiki/VTK_FAQ">http://www.vtk.org/Wiki/VTK_FAQ</a>
<br>> > > Follow this link to subscribe/unsubscribe:<br>> > > <a href="http://www.vtk.org/mailman/listinfo/vtkusers">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>> > ><br>> > ><br>
> ><br>><br>><br>><br></blockquote></div><br>