2012-02-04 3 views
2

Существует ли элегантный путь в Matlab, чтобы получить выход normxcorr2 обрезается до размера изображение или обрезается только на часть матрицы, которая не использует нулевые заполненные ребра при вычислении?Элегантный способ получить выход `normxcorr2` в манере, подобной«CONV2»- (удаление нежелательных краев)

Чтобы понять, что я имею в виду, рассмотрим команду conv2. Существует необязательный параметр: shape, который может быть установлен на same или valid.

C = conv2(A,B,'same'); 
C = conv2(A,B,'valid'); 

Например:

size(conv2(rand(50,50) , rand(6,6), 'valid')) 

ANS =

45 45 

size(conv2(rand(50,50) , rand(6,6), 'same')) 

ANS =

50 50 

size(conv2(rand(50,50) , rand(6,6))) 

ANS =

55 55 

В настоящее время я написал свою собственную функцию, что делает что-то вроде этого:

function I = normxcorr2e(template,im,shape) 
    switch shape 
     case 'same' 
      I = normxcorr2(template,im); 
      r = size(I,1)-size(im,1); 
      c = size(I,2)-size(im,2); 

      m1=floor(r/2); 
      n1=floor(c/2); 
      m2=ceil(r/2); 
      n2=ceil(c/2); 

      I(1:m2,:) = []; 
      I(end-m1+1:end,:) = []; 

      I(:,1:n2) = []; 
      I(:,end-n1+1:end) = []; 
     case 'full' 
      %Do nothing 
     case 'valid' 
      %TODO - write this case... 
     otherwise 
      throw(Mexception('normxcorr2e:BadInput','shape %s is not recognized',shape)); 
    end 

end 

У вас есть идея получше? Основным критерием для успешного ответа будет элегантность предлагаемого решения.

Редактировать (1) Прежде всего, спасибо за все ваши ответы. Все они хороши и поддерживаются мной. Я до сих пор не решил, что лучше. Кстати, я недавно думаю о том, где шаблон большой по сравнению с изображением. В этом случае имеет смысл ускорить вычисление, обрезая аргумент image перед запуском normxcorr2.

+0

ли рассчитывать правильность, а? :) – Jonas

+0

@Jonas, yes :) Elegance - главный критерий, а не единственный –

+0

Я попытался найти способ, которым вы могли бы назвать свою функцию с тем же именем и затенять версию инструментария, позволяя ей действовать как невидимая оболочка. К сожалению, вызов теневой функции с помощью [BUILTIN] (http://www.mathworks.com/help/techdoc/ref/builtin.html) работает только для встроенных функций * non-toolbox *, поэтому я не мог получить что работать. – gnovice

ответ

2

Вот вариант, который имеет несколько дополнительных функций по сравнению с другими ответами:

  • Это позволяет опустить аргумент формы (по умолчанию 'full').
  • Это только normxcorr2, когда shape является допустимой строкой.
  • Он выполняет индексацию в одной строке с использованием logical indexing. Размеры свинцовой подкладки и желаемой центральной области используются для создания индексных векторов истинных и ложных значений.Заключительное дополнение не нужно указывать, так как логический индекс, который короче индекса, будет просто дополнен ложными значениями.

А вот код:

function I = normxcorr2e(template, im, shape) 

    if (nargin == 2) || strcmp(shape,'full') 
     I = normxcorr2(template, im); 
     return 
    end 

    switch shape 
     case 'same' 
      pad = floor(size(template)./2); 
      center = size(im); 
     case 'valid' 
      pad = size(template) - 1; 
      center = size(im) - pad; 
     otherwise 
      throw(Mexception('normxcorr2e:BadInput',... 
       'SHAPE must be ''full'', ''same'', or ''valid''.')); 
    end 

    I = normxcorr2(template, im); 
    I = I([false(1,pad(1)) true(1,center(1))], ... 
     [false(1,pad(2)) true(1,center(2))]); 

end 
1

Здесь не так много элегантности - вы выполняете корреляцию, а затем удаляете то, что вы не можете использовать. Но это работает.

function I = normxcorr2e(template,im,shape) 

%# perform cross correlation with automated zero-padding 
I = normxcorr2(template,im); 

switch shape 
    case 'same' 

     %# if we were guaranteed to have odd-sized templates only 
     %# we would only need padLow 
     templateSize = size(template); 
     padLow = floor(templateSize/2); 
     padHigh = templateSize - padLow - 1; 

     I = I((1+padLow(1)):(end-padHigh(1)), (1+padLow(2)):(end-padHigh(2))); 

    case 'full' 
     %Do nothing 
    case 'valid' 
     %# with even size, we need to remove the larger of the two pad sizes 
     %# i.e. padLow, on all sides 
     templateSize = size(template); 
     padLow = templateSize/2; 

     I = I((2*padLow(1)):(end-2*padLow(1)+1), (2*padLow(2)):(end-2*padLow(2)+1)); 
    otherwise 
     throw(Mexception('normxcorr2e:BadInput','shape %s is not recognized',shape)); 
end 
+0

Спасибо, ваша версия и все остальное хороши. они были поддержаны мной. У меня был жесткий выбор здесь. –

2

Это было бы гораздо более кратким. Я надеюсь, что это то, что вы ищете:

function I = normxcorr2e(template,im,shape) 

    args={'full','same','valid'}; 
    cropSize=(find(strcmp(shape,args))-1)*size(template); 
    [email protected](x,r) x(1+floor(r(1)/2):end-ceil(r(1)/2),1+floor(r(2)/2):end-ceil(r(2)/2)) 
    I=crop(normxcorr2(template,im),cropSize); 
+0

Спасибо, ваша версия и все остальные хорошие, поэтому они были поддержаны мной. У меня был жесткий выбор. –

 Смежные вопросы

  • Нет связанных вопросов^_^