How to locate the the position of a 3D subimage in larger image in Matlab?

9 次查看(过去 30 天)
I have a 3D subimage saved as X.mat , which is a subimage of the 3D image Y.mat. How can I find the position of this subimage in the image Y?
Can anyone help me?
Thanks,

回答(2 个)

David Young
David Young 2014-7-29
Assuming you have used load to read the mat-files and the images are stored as X and Y, you can look for an exact match by checking each subimage of Y.
found = false;
for r = 1:size(Y,1)-size(X,1)+1
for c = 1:size(Y,2)-size(X,2)+1
for s = 1:size(Y,3)-size(X,3)+1
if isequal(Y(r:r+size(X,1)-1, c:c+size(X,2)-1, s:s+size(X,3)-1), X)
found = true;
break
end
end
if found
break
end
end
if found
break
end
end
if found
fprintf('Match found at: %d %d %d\n', r, c, s);
else
fprintf('No match found\n');
end
This reports the coordinates of the low-index corner of the match.
If the subimage is not an exact subimage, you need to use some other technique, such as normalised cross-correlation.
  3 个评论
Image Analyst
Image Analyst 2014-8-2
It should find only one coordinate if it occurs just one time in the larger volume. (I didn't look over the code in detail but assumes it finds the upper left corner or something like that.) If it occurs twice it will find two . If you wanted a listing of all coordinates in the rectangular block at the one "found" location then you can to that by adding the width, length, and height to the one found coordinate (upper left corner). That will get you a whole "block" of coordinates.

请先登录,再进行评论。


Ahmet Cecen
Ahmet Cecen 2014-7-29
Depending on the size and type of data, it might be preferable to use a convolution or an erosion. I can't give a specific code snippet without further information.
  1 个评论
Alex Taylor
Alex Taylor 2014-8-4
I just wanted to chain off of Ahmet that this is a 3-D template matching problem. David Young's solution is very helpful, and will work fine if you are truly looking for one and only one EXACT match in the larger volume. More typically when doing template matching, either the template or the larger image are not exact matches of one another (there are noise, illumination differences, etc.). In these cases, people usually turn to algorithms like normalized cross correlation and determine the position in the correlation matrix with the highest peak correlation. This method will work even when there isn't an exact match.
You might want to look at
normxcorr2
in IPT as an introduction to the 2-D template matching workflow. You could try to implement your own 3-D extension to normxcorr2 using
convn
or
fftn
(depending on your template image size either the spatial domain or the frequency domain will be faster).

请先登录,再进行评论。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by