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
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
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
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
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
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