Для фиксированного и заданного TForm, команда imwarp в Image Processing ToolboxБыстрого вычисления матриц варпа
B = imwarp(A,tform)
линейно относительно А, значит, существует некоторый разреженная матрица W, в зависимости от TForm но независимый от, таким образом, что выше, могут быть реализованы
что то же самоеB(:)=W*A(:)
для всех А фиксированных известных размеров [N, N]. Мой вопрос в том, есть ли быстрые/эффективные варианты для вычисления W. Матричная форма необходима, когда мне нужна операция транспонирования W. '* B (:), или если мне нужно сделать W \ B (:) или аналогичную линейную алгебраическую вещи, которые я не могу сделать непосредственно через imwarp в одиночку.
Я знаю, что можно вычислить W столбец за столбцом, делая
E=zeros(n);
W=spalloc(n^2,n^2,4*n^2);
for i=1:n^2
E(i)=1;
tmp=imwarp(E,tform);
E(i)=0;
W(:,i)=tmp(:);
end
, но это грубая сила и медленно.
Процедура FUNC2MAT несколько более оптимальна тем, что она использует цикл для вычисления/сбора разреженных данных ввода I, J, S каждого столбца W (:, i). Затем, после цикла, он использует это для построения общей разреженной матрицы. Он также предлагает возможность использования петли PARFOR. Однако это все еще медленнее, чем хотелось бы.
Может ли кто-нибудь предложить более оптимальные по скорости альтернативы?
EDIT:
Для тех дискомфортных с моим утверждением, что imwarp (A, ТГогт) линейна w.r.t. A, я включаю демо-скрипт ниже, который проверяет, что свойство суперпозиции выполнено для случайных входных изображений и данных tform. Его можно многократно запускать, чтобы увидеть, что nonlinearityError
всегда мал и легко связан с шумом с плавающей запятой.
tform=affine2d(rand(3,2));
%tform=projective2d(rand(3));
[email protected](A) imwarp(A,tform,'cubic');
I1=rand(100); I2=rand(100);
c1=rand; c2=rand;
LHS=fun(c1*I1+c2*I2); %left hand side
RHS=c1*fun(I1)+c2*fun(I2); %right hand side
linearityError = norm(LHS(:)-RHS(:),'inf')
Я не уверен, что вам пример кода, где вы говорите, что вы можете вычислить 'W 'имеет смысл. Вы опускаете шаги? Не следует ли 'imwarp' возвращать матрицу? Но вы устанавливаете его равным столбцу 'W'. И вы предварительно выделили 'W'? Кроме того, кажется, что нет необходимости в перестройке и использовании разреженных, если вы просто собираетесь создать полную матрицу для «A», которую вы переходите в «imwarp». Пусть 'E = нули (n);'. Затем на каждой итерации 'E (i) = 1;' перед переходом в 'imwarp' и' E (i) = 0; 'впоследствии для отмены. – horchler
@horchler Я исправил представление цикла for, так что W (:, i) назначается правильно сформированный и разреженный вектор столбца. Да, я сначала пропустил показ предварительного выделения W для улучшения читаемости, но он предварительно выделен, и я включил это сейчас.FUNC2MAT действительно делает что-то более умное, чем это, используя цикл, чтобы предварительно вычислить разреженные данные таблицы I, J, S до построения W. –
@Jigg. Записи W будут зависеть от tform, но imwarp является линейной функцией от A и поэтому он должен иметь якобиан, не зависящий от А. Якобиан есть W. Положим его в 1D членов. Наклон m прямой y = m * x никогда не зависит от x. Не знаете, почему вы предлагаете imwarp (одни (размер (A)), tform). Деформация однородного изображения является еще одним однородным изображением для любого разумного интерполятора. –