Home > mfiles > conv2PreserveEnergy.m

conv2PreserveEnergy

PURPOSE ^

SYNOPSIS ^

function result = conv2PreserveEnergy(data,filter)

DESCRIPTION ^

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function result = conv2PreserveEnergy(data,filter)
0002 
0003 result = conv2(data,filter,'same');
0004 rsize = size(result);
0005 fsize = size(filter);
0006 fsize2 = (fsize - 1)/2;
0007 fsum = sum(filter(:));
0008 
0009 ystart = 1 + fsize2(1);
0010 yend = rsize(1) - fsize2(1);
0011 xstart = 1 + fsize2(2);
0012 xend = rsize(2) - fsize2(2);
0013 
0014 if (rsize(1) > fsize(1))
0015   for y = 1:fsize2(1)
0016     % top
0017     fSumTop = sum(sum(filter(fsize(1)-y:fsize(1),:)));
0018     if (fSumTop ~= 0)
0019       result(y,xstart:xend) = result(y,xstart:xend) * fsum / fSumTop;
0020     end
0021     
0022     % bottom
0023     fSumBottom = sum(sum(filter(1:y,:)));
0024     if (fSumBottom ~= 0)
0025       result(rsize(1)-y+1,xstart:xend) = result(rsize(1)-y+1,xstart:xend) * fsum / fSumBottom;
0026     end
0027   end
0028 end
0029 
0030 if (rsize(2) > rsize(1))
0031   for x = 1:fsize2(2)
0032     % left
0033     fSumLeft = sum(sum(filter(:,fsize(2)-x:fsize(2))));
0034     if (fSumLeft ~= 0)
0035       result(ystart:yend,x) = result(ystart:yend,x) * fsum / fSumLeft;
0036     end
0037     
0038     % right
0039     fSumRight = sum(sum(filter(:,1:x)));
0040     if (fSumRight ~= 0)
0041       result(ystart:yend,rsize(2)-x+1) = result(ystart:yend,rsize(2)-x+1) * fsum / fSumRight;
0042     end
0043     
0044     % corners
0045     if (rsize(1) > fsize(1))
0046       for y = 1:fsize2(1)
0047         fSumTL = sum(sum(filter(fsize(1)-y:fsize(1),fsize(2)-x:fsize(2))));
0048         if (fSumTL ~= 0)
0049           result(y,x) = result(y,x) * fsum / fSumTL;
0050         end
0051         
0052         fSumTR = sum(sum(filter(fsize(1)-y:fsize(1),1:x)));
0053         if (fSumTR ~= 0)
0054           result(y,rsize(2)-x+1) = result(y,rsize(2)-x+1) * fsum / fSumTR;
0055         end
0056         
0057         fSumBL = sum(sum(filter(1:y,fsize(2)-x:fsize(2))));
0058         if (fSumBL ~= 0)
0059           result(rsize(1)-y+1,x) = result(rsize(1)-y+1,x) * fsum / fSumBL;
0060         end
0061         
0062         fSumBR = sum(sum(filter(1:y,1:x)));
0063         if (fSumBR ~= 0)
0064           result(rsize(1)-y+1,rsize(2)-x+1) = result(rsize(1)-y+1,rsize(2)-x+1) * fsum / fSumBR;
0065         end
0066       end
0067     end
0068   end
0069 end

Generated on Fri 07-Sep-2007 14:42:18 by m2html © 2003