Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i effectively compare an image with another image whose resolution is double of the original image?

I have two sets of 3D images (they come in form of 2D stacks). Image A is 10 micron, with size: 1000 x 1024 x 1017, while image B is 5 micron, with size: 2004 x 2048 x 2036. I like to make some computations on randomly chosen set of the 2D slices of A, and then compare this to the same set of slices for B. However, since B has twice the number of slices for each slice of A, will it be sensible to compare two slices of B to each of A? If so, how do i determine exactly which of the two slices of B make up a slice of A?

While contemplating on this, i also thought of blowing up A by 2 using imresize function for each 2D slice that i chose for the computation. Will it be okay to compare this new B with the A, considering that i have completely ignored what happens with the z-coordinate?

Thank you.

like image 558
User110 Avatar asked Jan 31 '26 23:01

User110


1 Answers

As you mentioned this is microCT, I am assuming that both images are different size resolution of the same object. This means that pixels have specific spatial location, not only value, therefore for this case, there are no pixels (assuming a pixel is a infinitesimally small dot in the center of the cube) that match in both images.

So, lets assume that in image A, the locations of the pixel centers are their indices (1,1,1), (1,1,2) etc. This means that the image starts (pixel boundaries) at "world value" 0.5, and ends at size(imgA)+0.5

Now, first lets transform the desired pixel coordinates for interpolation to this range. imgB pixel centers are then in locations (ind-0.5)*size(imgA)/size(imgB)+0.5.


Example: Assume

size(imgA,1)=3; size(imgB,1)=4;

therefore the pixels in imgA are at x location 1:3. The pixels on imgB are, using the above formula, in [0.8750 1.6250 2.3750 3.1250]. Note how the first pixel is 0.375 from 0.5 (our image border) and the next pixel is at 0.75 (double 0.375*2).

We scaled a higher resolution image to the same "real world" coordinates.


Now to the real stuff.

We need to create the desired coordinates in the reference (A) image. For that, we do:

[y, x, z]=...
   ndgrid((1:size(imgB,1)-0.5)*size(imgA,1)/size(imgB,1)+0.5),...
          (1:size(imgB,2)-0.5)*size(imgA,2)/size(imgB,2)+0.5),...
          (1:size(imgB,3)-0.5)*size(imgA,3)/size(imgB,3)+0.5);

Now these 3 have the coordinates we want. Caution! each of these are size(imgB) !!! You need to have the RAM 5*size(imgB) in total to work with this.

Now we can interpolate

imAinB=interp3(imgA,x,y,z,'linear'); % Or nearest
like image 71
Ander Biguri Avatar answered Feb 03 '26 20:02

Ander Biguri



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!