Использование MATLAB для расчета смещения между последовательными изображениями - PullRequest
4 голосов
/ 26 февраля 2011

Я снимаю изображения, используя туннельный микроскоп. Тем не менее, область перемещается между последовательными изображениями. Я пытаюсь использовать MatLab для расчета смещения между изображениями. Приведенный ниже код рассчитывается в секундах для небольших изображений (например, 64x64 пикселей), но занимает более 2 часов для обработки изображений с разрешением 512x512 пикселей, с которыми я имею дело. Есть ли у вас какие-либо предложения по ускорению этого кода? Или вы знаете лучшие способы отслеживания изображений в MatLab? Спасибо за вашу помощь!

%Test templates
template = .5*ones(32);
template(25:32,:) = 0;
template(:,25:64) = 0;
data_A = template;
close all
imshow(data_A);
template(9:32,41:64) = .5;
template(:,1:24) = 0;
data_B = template;
figure, imshow(data_B);

tic

[m n] = size(data_B);
z = [];

% Loop over all possible displacements
for x = -n:n

for y = -m:m

    paddata_B = data_B;
    ax = abs(x);
    zerocols = zeros(m,ax);

    if x > 0
        paddata_B(:,1:ax) = [];
        paddata_B = [paddata_B zerocols];

    else
        paddata_B(:,(n-ax+1):n) = [];
        paddata_B = [zerocols paddata_B];

    end

    ay = abs(y);
    zerorows = zeros(ay,n);


    if y < 0
        paddata_B(1:ay,:) = [];
        paddata_B = vertcat(paddata_B, zerorows);

    else
        paddata_B((m-ay+1):m,:) = [];
        paddata_B = vertcat(zerorows, paddata_B);

    end

% Full matrix sum after array multiplication
C = paddata_B.*data_A;        
matsum = sum(sum(C));

% Populate array of matrix sums for each displacement    
z(x+n+1, y+m+1) = matsum;

end
end

toc

% Plot matrix sums
figure, surf(z), shading flat

% Find maximum value of z matrix
[max_z, imax] = max(abs(z(:)));
[xpeak, ypeak] = ind2sub(size(z),imax(1))

% Calculate displacement in pixels
corr_offset = [(xpeak-n-1) (ypeak-m-1)];
xoffset = corr_offset(1)
yoffset = corr_offset(2)  

Ответы [ 4 ]

4 голосов
/ 26 февраля 2011

То, что вы рассчитываете, называется взаимной корреляцией двух изображений.Вы можете рассчитать взаимную корреляцию всех смещений одновременно , используя дискретные преобразования Фурье (DFT или FFT).Так что попробуйте что-то вроде

z = ifft2( fft2(dataA) .* fft2(dataB).' );

Если вы дополняете нулями в области Фурье, вы даже можете использовать этот тип математики, чтобы получить смещения в долях пикселя и применить смещения фракций пикселя кизображение.

3 голосов
/ 26 февраля 2011

Типичный подход к решению этой проблемы заключается в использовании того факта, что он быстро работает для небольших изображений, в ваших интересах. Если у вас есть большие изображения, прорежьте их, чтобы сделать маленькие изображения. Быстро зарегистрируйте маленькие изображения и используйте вычисленное смещение в качестве исходного значения для следующей итерации. На следующей итерации вы не будете так сильно децитировать изображения, но начнете с хорошей начальной оценки смещения, чтобы вы могли ограничить поиск решений небольшой окрестностью рядом с вашей первоначальной оценкой.

Хотя этот документ не написан с учетом туннельных микроскопов, обзорный документ, который может оказать некоторую помощь: «Взаимная регистрация медицинских изображений на основе информации: исследование Pluim, Maintz и Viergever, опубликованное в IEEE Transactions on Medical Imaging. Вып. 22, № 8, с. 986.

1 голос
/ 28 февраля 2016

ниже ссылка поможет вам найти преобразование между 2 изображениями и исправить / восстановить искаженное (в вашем случае, изображение со смещением)

http://in.mathworks.com/help/vision/ref/estimategeometrictransform.html

index_pairs = matchFeatures(featuresOriginal,featuresDistorted, 'unique', true);
matchedPtsOriginal  = validPtsOriginal(index_pairs(:,1));
matchedPtsDistorted = validPtsDistorted(index_pairs(:,2));
[tform,inlierPtsDistorted,inlierPtsOriginal] = estimateGeometricTransform(matchedPtsDistorted,matchedPtsOriginal,'similarity');
figure; showMatchedFeatures(original,distorted,inlierPtsOriginal,inlierPtsDistorted);

InlierPtsDistored, inlierPtsOriginal имеют атрибуты, называемые местоположениями. Это не что иное, как сопоставление местоположений одного изображения на другом. Я думаю, что с этого момента очень легко рассчитать смещение.

0 голосов
/ 26 февраля 2011

Функция ниже была моей попыткой вычислить взаимную корреляцию двух изображений вручную. Что-то не совсем правильно, хотя. Посмотрим на это снова в эти выходные, если у меня будет время. Вы можете вызвать функцию с чем-то вроде:

>> oldImage = rand(64);
>> newImage = circshift(oldImage, floor(64/2)*[1 1]);
>> offset = detectOffset(oldImage, newImage, 10)

offset =

    32    -1
function offset = detectOffset(oldImage, newImage, margin)

    if size(oldImage) ~= size(newImage)
        offset = [];
        error('Test images must be the same size.');
    end

    [imageHeight, imageWidth] = size(oldImage);

    corr = zeros(2 * imageHeight - 1, 2 * imageWidth - 1);

    for yIndex = [1:2*imageHeight-1; ...
                  imageHeight:-1:1 ones(1, imageHeight-1); ...
                  imageHeight*ones(1, imageHeight) imageHeight-1:-1:1];
        oldImage = circshift(oldImage, [1 0]);
        for xIndex = [1:2*imageWidth-1; ...
                      imageWidth:-1:1 ones(1, imageWidth-1); ...
                      imageWidth*ones(1, imageWidth) imageWidth-1:-1:1];
            oldImage = circshift(oldImage, [0 1]);
            numPoint = abs(yIndex(3) - yIndex(2) + 1) * abs(xIndex(3) - xIndex(2) + 1);
            corr(yIndex(1),xIndex(1)) = sum(sum(oldImage(yIndex(2):yIndex(3),xIndex(2):xIndex(3)) .* newImage(yIndex(2):yIndex(3),xIndex(2):xIndex(3)))) * imageHeight * imageWidth / numPoint;
        end
    end

    [value, yOffset] = max(corr(margin+1:end-margin,margin+1:end-margin));
    [dummy, xOffset] = max(value);
    offset = [yOffset(xOffset)+margin-imageHeight xOffset+margin-imageWidth];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...