如何显示两个互相关图像之间的箭袋图?

How can I display a quiver plot between two cross-correlated images?

我在 MATLAB 中编写了一段代码,它允许我自动裁剪一幅图像中的感兴趣区域,并与第二幅图像执行互相关。相关区域由颤抖图标识,我想将其扩展到两个图像(它们以垂直蒙太奇排列)。但是,箭袋箭头仅出现在上图中。 有谁知道为什么会发生这种情况(以及如何解决)?希望这是直截了当的事情。我在下面包含了一些代码。谢谢!

Initial = rgb2gray(imread('img9.png'));
Secondary = rgb2gray(imread('img8.png'));
XC = imcrop(Initial, [0 0 1300 350]);
YC = imcrop(Secondary, [0 0 1300 350]);
Multi = cat(1,XC,YC);
VertLinSpace1 = linspace(0, 300, 7);
HorzLinSpace1 = linspace(0, 1250, 24);
imshow(Multi)
axis( [0  1300   0  700])
axis on
for k1 = 1:length(VertLinSpace1)
    for k2 = 1:length(HorzLinSpace1)
        template = imcrop(Multi, [HorzLinSpace1(k2)  VertLinSpace1(k1), 50  50]);
        c = normxcorr2(template,YC);
        [ypeak, xpeak] = find(c==max(c(:)));
        yO = ypeak-size(template,1);
        xO = xpeak-size(template,2);
        x1 = HorzLinSpace1(k2); y1 = VertLinSpace1(k1); x2 = xO+1; y2 = yO+1;
        a = [x1, y1, 0];
        b = [x2, y2, 0];
        Q = [x1 y1
            x2 y2];
        QX = Q(:,1);
        QY = Q(:,2);
        [~,UV] = gradient(Q);
        UVX = [UV(1,1); 0];
        UVY = [UV(1,2); 0];
        figure(1)
        hold on
        quiver(QX, QY, UVX, UVY, 'color','red')
        hold off
    end
end

Initial image Comparison image

我简化了箭头XY的计算,其实质是加了350指向下半部分。我添加了 25 来指示模板的中间(箭头的尾部)。这可能不是 100% 准确的解决方案,因为,例如,50 x 50 像素正方形的中间是 25.5(每边 25 像素),但它解决了主要问题,您可以从这里开始。

Initial = rgb2gray(imread('https://i.stack.imgur.com/5fTa1.png'));
Secondary = rgb2gray(imread(('https://i.stack.imgur.com/sg1co.png')));
XC = imcrop(Initial, [0 0 1300 350]);
YC = imcrop(Secondary, [0 0 1300 350]);
Multi = cat(1,XC,YC);
VertLinSpace1 = linspace(0, 300, 7);
HorzLinSpace1 = linspace(0, 1250, 24);
imshow(Multi)
axis( [0  1300   0  700])
axis on
hold on
counter = 0;
for kV = 1:length(VertLinSpace1)
    for kH = 1:length(HorzLinSpace1)
        template = imcrop(Multi, [HorzLinSpace1(kH)  VertLinSpace1(kV), 50  50]);
        c = normxcorr2(template,YC);
        [ypeak, xpeak] = find(c==max(c(:)));
        fromXY = [HorzLinSpace1(kH)+25,VertLinSpace1(kV)+25];
        addXY = [xpeak-fromXY(1),350+ypeak-fromXY(2)];
        quiver(fromXY(1), fromXY(2), addXY(1), addXY(2), 'color','red')
        drawnow
    end
end