Как я могу отобразить колчан между двумя взаимно коррелированными изображениями? - PullRequest
0 голосов
/ 29 февраля 2020

Я написал код в 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

Исходное изображение Сравнительное изображение

1 Ответ

0 голосов
/ 01 марта 2020

Я упростил вычисление стрелки XY, но суть заключалась в том, чтобы добавить 350, чтобы указать на вторую половину. Я добавил 25, чтобы указать середину шаблона (хвост стрелки). Это может быть не на 100% точным решением, потому что, например, середина квадрата 50 на 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
...