Я пытаюсь реализовать метод дифференциальной фазовой интеграции, описанный в этой статье: Thüring, Thomas, et al. «Нелинейный регуляризованный поиск фазы для однонаправленной рентгеновской дифференциальной фазово-контрастной рентгенографии». Оптика express 19,25 (2011): 25545-25558 .
По сути, это способ интеграции разностного изображения только по столбцам, в то же время накладывая некоторые ограничения на непрерывность по строкам, чтобы предотвратить полосовой шум. С математической точки зрения я хочу минимизировать следующее уравнение:
где ||. || это норма L2, Dx - производная по столбцам, Dy - производная по строкам, A - неизвестная интегрированная матрица, лямбда - определяемый пользователем параметр, а phi - дифференциальный профиль, который я измерил. Обратите внимание, что для оператора Dy также может использоваться норма L1.
Я записал код, используя fminun c в качестве решателя Matlab
pdiff=imresize(diff(padarray(p,[0,1],'replicate','post'),1,2),[128,128]);
noise = 0.02 * randn(size(pdiff));
pdiff_noise = pdiff + noise ;
% normal integration
integratedProfile=cumsum(pdiff_noise,2);
options=optimoptions(@fminunc,'Display','iter-detailed','UseParallel',true,'MaxIterations',35);
% regularized integration
startingPoint=zeros(size(pdiff_noise));
fun=@(x)costFunction(pdiff_noise,x);
integratedProfile_optmized=fminunc(fun,startingPoint,options);
function difference=costFunction(ep,op)
L=0.2;
dep_o=diff(padarray(op,[0,1],'replicate','post'),1,2);
dep_v=diff(padarray(op,[1,0],'replicate','post'),1,1);
difference=sum(sum((ep-dep_o).^2))+L*sum(sum(dep_v.^2));
end
Это работает используя разностное изображение 128x128. Проблема возникает, как только я пытаюсь работать с большим изображением. В частности, когда я использую матрицу 256x256, для каждой итерации требуется вечность, даже если используется параллельная опция, и занимает почти всю оперативную память. Когда я перехожу к матрице 512x512, я получаю эту ошибку
Requested 262144x262144 (512.0GB) array exceeds maximum
array size preference.
Error in fminusub (line 165)
H = eye(sizes.nVar);
Error in fminunc (line 446)
[x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] =
fminusub(funfcn,x, ...
Error in Untitled (line 13)
integratedProfile_optmized=fminunc(fun,startingPoint,options);
К сожалению, моя конечная цель - обработать приблизительно 3000 изображений размером 500x500.
Мне кажется, я понял, что cra sh проблема связана с размером матрицы и с тем, что каждый пиксель является переменной. Поэтому Matlab нужно вычислить огромный гессиан, который не помещается в память. Тем не менее, я не знаю, как решить эту проблему, а также ускорить обработку. Есть ли у вас какие-либо предложения по работе с большими изображениями? Есть ли другой решатель, который может работать быстрее? Есть математический подход к решению проблемы?
Спасибо!