function [gradient, or] = canny(im, sigma, scaling, vert, horz) xscaling = vert; yscaling = horz; hsize = [6*sigma+1, 6*sigma+1]; % The filter size. gaussian = fspecial('gaussian',hsize,sigma); im = filter2(gaussian,im); % Smoothed image. 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); % Gradient amplitude. or = atan2(-Y, X); % Angles -pi to + pi. neg = or<0; % Map angles to 0-pi. or = or.*~neg + (or+pi).*neg; or = or*180/pi; % Convert to degrees.
时间: 2024-04-15 08:25:08 浏览: 112
这段代码是用于实现Canny边缘检测算法。函数`canny`接受五个参数:`im`表示输入图像,`sigma`表示高斯滤波器的标准差,`scaling`表示图像的缩放比例,`vert`表示垂直方向的缩放因子,`horz`表示水平方向的缩放因子。
首先,根据给定的标准差`sigma`计算高斯滤波器的大小`hsize`。
然后,使用`fspecial('gaussian',hsize,sigma)`生成高斯滤波器。
接下来,对输入图像进行高斯平滑处理,使用`im = filter2(gaussian,im)`。
然后,根据指定的缩放比例对图像进行缩放处理,使用`im = imresize(im, scaling)`。
接着,获取缩放后图像的大小`[rows, cols] = size(im)`。
接下来,利用差分近似计算水平方向、垂直方向和两个对角线方向上的梯度值。分别计算了`h`, `v`, `d1`, `d2`四个梯度。
然后,根据水平和垂直方向上的缩放因子对梯度进行缩放。
接着,计算梯度幅值,使用公式`gradient = sqrt(X.*X + Y.*Y)`。
然后,计算梯度方向,使用公式`or = atan2(-Y, X)`。并将角度转换为0到180度的范围。
最后,返回梯度幅值和梯度方向`gradient`和`or`。
阅读全文