0
点赞
收藏
分享

微信扫一扫

MATLAB--canny锐化滤波器

有点d伤 2022-04-14 阅读 63
matlab

在这里插入图片描述
% canny锐化滤波器
clc,clear,close all % 清理命令区、清理工作区、关闭显示图形
warning off % 消除警告
feature jit off % 加速代码运行
im = imread(‘coloredChips.png’); % 原图像
R = imnoise(im(:,:,1),‘gaussian’,0,0.01); % R + 白噪声
G = imnoise(im(:,:,2),‘gaussian’,0,0.01); % G + 白噪声
B = imnoise(im(:,:,3),‘gaussian’,0,0.01); % B + 白噪声
im = cat(3,R,G,B); % 原图像 + 白噪声

im1 = canny_fspecial(im,‘canny’); % 应用canny算子锐化图像
figure(‘color’,[1,1,1])
subplot(121),imshow(im,[]),title(‘original image’)
subplot(122),imshow(im1,[]),title(‘canny锐化滤波器’)
function canny_im = canny_fspecial(im,type)
if nargin < 2
type = ‘canny’;
end
if ~isa(im,‘double’)
im = double(im)/255;
end
switch type
case ‘canny’ % canny filter

r=im(:,:,1);g=im(:,:,2);b=im(:,:,3);
% 平滑滤波器
filter= [2 4 5 4 2;
         4 9 12 9 4;
         5 12 15 12 5;
         4 9 12 9 4;
         2 4 5 4 2];
filter=filter/115;

im_conv= convn(im,filter);  % 平滑滤波后图像

% 计算梯度
gradXfilt=[-1 0 1;   % 卷积模板convolution mask
           -2 0 2; 
           -1 0 1];
gradYfilt=[1  2   1; % 卷积模板 convolution mask
           0  0   0; 
          -1  -2  -1];
GradX= convn(im_conv,gradXfilt);  % 卷积
GradY= convn(im_conv,gradYfilt);  % 卷积
absgrad=abs(GradX)+abs(GradY);

% 计算梯度角
[a,b]=size(GradX);
theta=zeros([a b]);
for i=1:a
      for j=1:b
            if(GradX(i,j)==0)
               theta(i,j)=atan(GradY(i,j)/1e-10);
            else
                theta(i,j)=atan(GradY(i,j)/GradX(i,j));
            end
      end
 end
  theta=theta*(180/3.14);
  for i=1:a
      for j=1:b
            if(theta(i,j)<0)
                theta(i,j)= theta(i,j)-90;
                theta(i,j)=abs(theta(i,j));
            end
      end
 end
  for i=1:a
      for j=1:b
          if ((0<theta(i,j))&&(theta(i,j)<22.5))||((157.5<theta(i,j))&&(theta(i,j)<181))
                theta(i,j)=0;
          elseif (22.5<theta(i,j))&&(theta(i,j)<67.5)
                 theta(i,j)=45;
          elseif (67.5<theta(i,j))&&(theta(i,j)<112.5)  
                  theta(i,j)=90;
          elseif (112.5<theta(i,j))&&(theta(i,j)<157.5)
                  theta(i,j)=135;
          end
      end
  end 

% 非极大值抑制
canny_im = padarray(absgrad, [1 1]);

% A = [1 2; 3 4];
% B = padarray(A,[3 2],‘replicate’,‘post’)
% B =
% 1 2 2 2
% 3 4 4 4
% 3 4 4 4
% 3 4 4 4
% 3 4 4 4
[a,b]=size(theta);
for i=2:a-2
for j=2:b-2
if (theta(i,j)==135)
if ((canny_im(i-1,j+1)>canny_im(i,j))||(canny_im(i+1,j-1)>canny_im(i,j)))
canny_im(i,j)=0;
end
elseif (theta(i,j)==45)
if ((canny_im(i+1,j+1)>canny_im(i,j))||(canny_im(i-1,j-1)>canny_im(i,j)))
canny_im(i,j)=0;
end
elseif (theta(i,j)==90)
if ((canny_im(i,j+1)>canny_im(i,j))||(canny_im(i,j-1)>canny_im(i,j)))
canny_im(i,j)=0;
end
elseif (theta(i,j)==0)
if ((canny_im(i+1,j)>canny_im(i,j))||(canny_im(i-1,j)>canny_im(i,j)))
canny_im(i,j)=0;
end
end
end
end

end
end

举报

相关推荐

0 条评论