Halcom 发表于 2017-3-8 23:25:43

fspecial滤波算子

function h = fspecial(type,p2)

if nargin < 2
    switch type
        case 'average'
      p2 = ;% siz
    case 'disk'
      p2 = 5;      % rad
    end
end

switch type
case 'average' % Smoothing filter
   siz = p2;
   h   = ones(siz)/prod(siz);

case 'disk' % Disk filter
   rad   = p2;
   crad= ceil(rad-0.5);
    = meshgrid(-crad:crad,-crad:crad);
   maxxy = max(abs(x),abs(y));
   minxy = min(abs(x),abs(y));
   m1 = (rad^2 <(maxxy+0.5).^2 + (minxy-0.5).^2).*(minxy-0.5) + ...
          (rad^2 >= (maxxy+0.5).^2 + (minxy-0.5).^2).* ...
                sqrt(rad^2 - (maxxy + 0.5).^2);
   m2 = (rad^2 >(maxxy-0.5).^2 + (minxy+0.5).^2).*(minxy+0.5) + ...
          (rad^2 <= (maxxy-0.5).^2 + (minxy+0.5).^2).* ...
         sqrt(rad^2 - (maxxy - 0.5).^2);
   sgrid = (rad^2*(0.5*(asin(m2/rad) - asin(m1/rad)) + ...
             0.25*(sin(2*asin(m2/rad)) - sin(2*asin(m1/rad)))) - ...
             (maxxy-0.5).*(m2-m1) + (m1-minxy+0.5)) ...
                .*((((rad^2 < (maxxy+0.5).^2 + (minxy+0.5).^2) & ...
             (rad^2 > (maxxy-0.5).^2 + (minxy-0.5).^2)) | ...
                ((minxy==0)&(maxxy-0.5 < rad)&(maxxy+0.5>=rad))));
   sgrid = sgrid + ((maxxy+0.5).^2 + (minxy+0.5).^2 < rad^2);
   sgrid(crad+1,crad+1) = min(pi*rad^2,pi/2);
   if ((crad>0) && (rad > crad-0.5) && (rad^2 < (crad-0.5)^2+0.25))
      m1= sqrt(rad^2 - (crad - 0.5).^2);
             m1n = m1/rad;
      sg0 = 2*(rad^2*(0.5*asin(m1n) + 0.25*sin(2*asin(m1n)))-m1*(crad-0.5));
      sgrid(2*crad+1,crad+1) = sg0;
      sgrid(crad+1,2*crad+1) = sg0;
      sgrid(crad+1,1)      = sg0;
      sgrid(1,crad+1)      = sg0;
      sgrid(2*crad,crad+1)   = sgrid(2*crad,crad+1) - sg0;
      sgrid(crad+1,2*crad)   = sgrid(crad+1,2*crad) - sg0;
      sgrid(crad+1,2)      = sgrid(crad+1,2)      - sg0;
      sgrid(2,crad+1)      = sgrid(2,crad+1)      - sg0;
   end
   sgrid(crad+1,crad+1) = min(sgrid(crad+1,crad+1),1);
   h = sgrid/sum(sgrid(:));

end

end


页: [1]
查看完整版本: fspecial滤波算子