Roberts算子、Prewitt算子、Sobel算子都只包含两个方向的模板,每种模板只对相应的方向敏感,对该方向上的变化有明显的输出,而对其他方向的变化响应不大。为了检测各个方向的边缘,需要有各个方向的微分模板。8个方向的kirsch模板较为常用,这8个方向依次成45夹角
用卷积函数conv2处理的MATLAB程序代码: - %% kirsch模板 方向算子
- clc,clear,close all % 清屏、清工作区、关闭窗口
- warning off % 消除警告
- feature jit off % 加速代码执行
- [filename ,pathname]=...
- uigetfile({'*.bmp';'*.jpg';},'选择图片'); %选择图片路径
- str = [pathname filename]; %合成路径+文件名
- im = imread(str); % 读图
- % i= rgb2gray(im);
- hsi=rgb2hsi(im);
- H = hsi(:, :, 1);
- S = hsi(:, :, 2);
- I = hsi(:, :, 3);
- a= I;
- a = medfilt2(a,[5,5]); % 中值滤波
- b=[-5 3 3;-5 0 3;-5 3 3]/1512;
- c=[3 3 3;-5 0 3;-5 -5 3]/1512;
- d=[3 3 3;3 0 3;-5 -5 -5]/1512;
- e=[3 3 3;3 0 -5; 3 -5 -5]/1512;
- f=[3 3 -5;3 0 -5;3 3 -5]/1512;
- g=[3 -5 -5;3 0 -5;3 3 3]/1512;
- h=[-5 -5 -5;3 0 3;3 3 3]/1512;
- i=[-5 -5 3;-5 0 3;3 3 3]/1512;
- b=conv2(a,b,'same');b=abs(b);
- c=conv2(a,c,'same');c=abs(c);
- d=conv2(a,d,'same');d=abs(d);
- e=conv2(a,e,'same');e=abs(e);
- f=conv2(a,f,'same');f=abs(f);
- g=conv2(a,g,'same');g=abs(g);
- h=conv2(a,h,'same');h=abs(h);
- i=conv2(a,i,'same');i=abs(i);
- p=max(b,c);
- p=max(d,p);
- p=max(e,p);
- p=max(f,p);
- p=max(g,p);
- p=max(h,p);
- p=max(i,p);
- figure,
- subplot(2,4,1),imshow(b,[]),
- subplot(2,4,2),imshow(c,[]),
- subplot(2,4,3),imshow(d,[]),
- subplot(2,4,4),imshow(e,[]),
- subplot(2,4,5),imshow(f,[]),
- subplot(2,4,6),imshow(g,[]),
- subplot(2,4,7),imshow(h,[]),
- subplot(2,4,8),imshow(i,[])
- figure,
- subplot(121),imshow(im,[]);title('原始图像')
- subplot(122),imshow(p,[]);title('kirsch模板')
复制代码
|