⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aplusatranspose.m

📁 curves ti si s a nice code.
💻 M
字号:
function S = APlusAtranspose( PSF, Acenter, boundary)%% This function exists specifically to handle the addition% A + Atranspose, where A is a psfMatrix.  It's called by% the overloaded method plus.m whenever the input matrices% are transposes of each other.%%  INPUT: PSF = the psf.image field of the psfMatrix that's being added%                to its own transpose%         Acenter = the center coordinates of the input PSF(s)%         boundary = the boundary condition of A%%  OUTPUT is a new psfMatrix with fields as follows:%        .psf is created from the summation of the original psf fields.%             Centers are aligned before adding.%             Care is taken so that the resulting psf is no larger than%             the original psf (if possible).%        .matdata as created as usual (by constructMatrix)%        .boundary is the same as A%        .type is determined by number of images in the psf%        .transpose = 0%%  L. Perrone  4/9/02%disp('You are entering the transpose zone')sa = size(PSF);% Make everything look like a 3D image in order to accommodate % actual 3D images in the loop (i,j,k)if length(sa)==1  sa = [sa 1 1];elseif length(sa) == 2  sa = [sa 1];endnewPsfs=cell(sa);for k=1:sa(3); for j=1:sa(2);  for i=1:sa(1);    summand1 = PSF{i,j,k};    summand1 = summand1/sum(summand1(:));    summand2 = summand1;    summand2 = flipdim(summand2,1);    summand2 = flipdim(summand2,2);    summand2 = flipdim(summand2,3);    Bcenter{i,j,k} = size(summand1) - Acenter{i,j,k};    % Pad around each image, however necessary,    % so that the resulting images are equal in size and have    % the same center coordinates.    Asize = size(summand1);    centerA = Acenter{i,j,k};    Bsize = size(summand2);    centerB = Bcenter{i,j,k};    Aprepad = centerB - centerA;    Aprepadsize = (Aprepad + abs(Aprepad))/2;    summand1 = padarray(summand1,Aprepadsize,'pre');    Bprepad = -Aprepad;    Bprepadsize = (Bprepad + abs(Bprepad))/2;    summand2 = padarray(summand2,Bprepadsize,'pre');    Apost = Asize - centerA;    Bpost = Bsize - centerB;    Apostpad = Bpost - Apost;    Apostpadsize = (Apostpad + abs(Apostpad))/2;    summand1 = padarray(summand1,Apostpadsize,'post');    Bpostpad = -Apostpad;    Bpostpadsize = (Bpostpad + abs(Bpostpad))/2;    summand2 = padarray(summand2,Bpostpadsize,'post');    % Add the psfs together to get the sum psf.    newPsf = summand1 + summand2;    newPsf = newPsf/sum(newPsf(:));    % Now for the messy stuff.    % Cut off excess rows &/or columns so the resultant PSF is     % no bigger than the input PSFs... but check the size of      % what you want to cut off before chopping.  If it's too large    % a piece, leave it in.    maxSize = max( Asize, Bsize);    sumSize = size(newPsf);    chopSize = sumSize - maxSize;    if length(chopSize)==1       chopSize=[chopSize 0 0];    elseif length(chopSize)==2       chopSize=[chopSize 0];    end    if (chopSize(1) > 0)      newPsf = circshift(newPsf,[chopSize(1) 0 0]);      rowNorms = zeros(2*chopSize(1),1);      for ii=1:2*chopSize(1)       rowNorms(ii) = norm(squeeze(newPsf(ii,:,:)));      end      blooble = zeros(chopSize(1)+1,1);      for ii=1:chopSize(1)+1        blooble(ii) = norm(rowNorms(ii:ii+chopSize(1)-1));      end      cutStart = find(min(blooble)==blooble);      if length(cutStart) ~= 1 %% (if more than one min is identified)         cutStart = cutStart(fix(length(cutStart)/2)+1);      end      if blooble(cutStart) < .01*norm(newPsf(:))         newPsf = cat(1, newPsf(1:cutStart-1,:,:), newPsf(cutStart+chopSize(1):sumSize(1),:,:));         newPsf = circshift(newPsf, [cutStart-1 0 0]);     else         newPsf = circshift(newPsf,[-chopSize(1) 0 0]);        disp('Row norms are too large for chopping')      end    end %%%   if (chopSize(1) > 0)    if (chopSize(2) > 0)      newPsf = circshift(newPsf,[0 chopSize(2) 0]);      colNorms = zeros(2*chopSize(2));      for ii=1:2*chopSize(2)      colNorms(ii) = norm(squeeze(newPsf(:,ii,:)));      end      blooble2 = zeros(chopSize(2)+1,1);      for ii=1:chopSize(2)+1        blooble2(ii) = norm(colNorms(ii:ii+chopSize(2)-1));      end      cutStart2 = find(min(blooble2)==blooble2);      if length(cutStart2) ~= 1 %% (if more than one min is identified)         cutStart2 = cutStart2(fix(length(cutStart2)/2)+1);      end      if blooble2(cutStart2) < .01*norm(newPsf(:))         newPsf = cat(2,newPsf(:,1:cutStart2-1,:), newPsf(:,cutStart2+chopSize(2):sumSize(2),:));         newPsf = circshift(newPsf,[0 cutStart2-1 0]);     else        newPsf = circshift(newPsf, [0 chopSize(2) 0]);        disp('Column norms are too large for chopping')      end    end %%%   if (chopSize(2) > 0)    if (chopSize(3) > 0)      newPsf = circshift(newPsf,[0 0 chopSize(3)]);      stackNorms = zeros(2*chopSize(3));      for ii=1:2*chopSize(3)      stackNorms(ii) = norm(squeeze(newPsf(:,:,ii)));      end      blooble3 = zeros(chopSize(3)+1,1);      for ii=1:chopSize(3)+1        blooble3(ii) = norm(stackNorms(ii:ii+chopSize(3)-1));      end      cutStart3 = find(min(blooble3)==blooble3);      if length(cutStart3) ~= 1 %% (if more than one min is identified)         cutStart3 = cutStart3(fix(length(cutStart3)/2)+1);      end      if blooble3(cutStart3) < .01*norm(newPsf(:))         newPsf = cat(3,newPsf(:,:,1:cutStart3-1), newPsf(:,:,cutStart3+chopSize(3):sumSize(3)));         [ci,cj,ck]=find(max(newPsf(:))==newPsf);         newPsf = circshift(newPsf,[0 0 cutStart3-1]);      else         newPsf = circshift(newPsf,[0 0 chopSize(3)]);         disp('Stack norms are too large for chopping')      end    end %%%   if (chopSize(3) > 0)    % Now that the chopping is complete, normalize the sum psf    % and assign it to its compartment in newPsfs    newPsfs{i,j,k} = newPsf/sum(newPsf(:));  end endend% Now build the new psfMatrix from the summed psf imageNewPSF = psf(newPsfs);S = psfMatrix(NewPSF,boundary);S=S*2;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -