www.gusucode.com > images 案例代码 matlab源码程序 > images/RegisterNormalizedCrossCorrelationExample.m
%% Registering an Image Using Normalized Cross-Correlation % This example shows how to find a template image within a larger image. % Sometimes one image is a subset of another. Normalized cross-correlation can % be used to determine how to register or align the images by translating one of % them. % Copyright 1993-2013 The MathWorks, Inc. %% Step 1: Read Image onion = imread('onion.png'); peppers = imread('peppers.png'); imshow(onion) figure, imshow(peppers) %% Step 2: Choose Subregions of Each Image % It is important to choose regions that are similar. The image |sub_onion| % will be the template, and must be smaller than the image |sub_peppers|. % You can get these sub regions using either the non-interactive script % below *or* the interactive script. % non-interactively rect_onion = [111 33 65 58]; rect_peppers = [163 47 143 151]; sub_onion = imcrop(onion,rect_onion); sub_peppers = imcrop(peppers,rect_peppers); % OR % interactively %[sub_onion,rect_onion] = imcrop(onion); % choose the pepper below the onion %[sub_peppers,rect_peppers] = imcrop(peppers); % choose the whole onion % display sub images figure, imshow(sub_onion) figure, imshow(sub_peppers) %% Step 3: Do Normalized Cross-Correlation and Find Coordinates of Peak % Calculate the normalized cross-correlation and display it as a surface % plot. The peak of the cross-correlation matrix occurs where the % sub_images are best correlated. |normxcorr2| only works on grayscale % images, so we pass it the red plane of each sub image. c = normxcorr2(sub_onion(:,:,1),sub_peppers(:,:,1)); figure, surf(c), shading flat %% Step 4: Find the Total Offset Between the Images % The total offset or translation between images depends on the location of % the peak in the cross-correlation matrix, and on the size and position of % the sub images. % offset found by correlation [max_c, imax] = max(abs(c(:))); [ypeak, xpeak] = ind2sub(size(c),imax(1)); corr_offset = [(xpeak-size(sub_onion,2)) (ypeak-size(sub_onion,1))]; % relative offset of position of subimages rect_offset = [(rect_peppers(1)-rect_onion(1)) (rect_peppers(2)-rect_onion(2))]; % total offset offset = corr_offset + rect_offset; xoffset = offset(1); yoffset = offset(2); %% Step 5: See if the Onion Image was Extracted from the Peppers Image % Figure out where |onion| falls inside of |peppers|. xbegin = round(xoffset+1); xend = round(xoffset+ size(onion,2)); ybegin = round(yoffset+1); yend = round(yoffset+size(onion,1)); % extract region from peppers and compare to onion extracted_onion = peppers(ybegin:yend,xbegin:xend,:); if isequal(onion,extracted_onion) disp('onion.png was extracted from peppers.png') end %% Step 6: Pad the Onion Image to the Size of the Peppers Image % Pad the |onion| image to overlay on |peppers|, using the offset % determined above. recovered_onion = uint8(zeros(size(peppers))); recovered_onion(ybegin:yend,xbegin:xend,:) = onion; figure, imshow(recovered_onion) %% Step 7: Use Alpha Blending To Show Images Together % Display one plane of the |peppers| image with the |recovered_onion| image % using alpha blending. figure, imshowpair(peppers(:,:,1),recovered_onion,'blend')