www.pudn.com > eyedemo.rar > canny.m
% CANNY - Canny边缘检测
% 代码使用了由 Fleck 提出的修改 (IEEE PAMI No. 3, Vol. 14. March 1992. pp 337-345)
%
% 使用:
% [gradient or] = canny(im, sigma)
%
% Arguments: im - 要处理的图像
% sigma - 高斯平滑滤波器的标准偏移,典型值为1
% scaling - 缩小输入图像的比例因子
% vert - 竖直梯度分量
% horz - 水平梯度分量
%
% Returns: gradient - 边界增强图像 (梯度幅值)
% or - 梯度方向 (0-180,顺/逆时针)
%
% 同时参见: NONMAXSUP, HYSTHRESH
function [gradient, or] = canny(im, sigma, scaling, vert, horz)
xscaling = vert;
yscaling = horz;
hsize = [6*sigma+1, 6*sigma+1]; % 滤波器格式定义
gaussian = fspecial('gaussian',hsize,sigma);
im = filter2(gaussian,im); % 平滑图像
im = imresize(im, scaling); % 比例缩小
[rows, cols] = size(im);
h = [ im(:,2:cols) zeros(rows,1) ] - [ zeros(rows,1) im(:,1:cols-1) ];
v = [ im(2:rows,:); zeros(1,cols) ] - [ zeros(1,cols); im(1:rows-1,:) ];
d1 = [ im(2:rows,2:cols) zeros(rows-1,1); zeros(1,cols) ] - ...
[ zeros(1,cols); zeros(rows-1,1) im(1:rows-1,1:cols-1) ];
d2 = [ zeros(1,cols); im(1:rows-1,2:cols) zeros(rows-1,1); ] - ...
[ zeros(rows-1,1) im(2:rows,1:cols-1); zeros(1,cols) ];
X = ( h + (d1 + d2)/2.0 ) * xscaling;
Y = ( v + (d1 - d2)/2.0 ) * yscaling;
gradient = sqrt(X.*X + Y.*Y); % 梯度幅值,上面为按公式计算
or = atan2(-Y, X); % 弧度-pi到+pi
neg = or<0; % 弧度画为0-pi
or = or.*~neg + (or+pi).*neg;
or = or*180/pi; % 转换为角度