# 图像处理 点 线边缘检测

## 【图像处理】MATLAB：点、线、边缘检测

2017-10-22 13:18:23 u013165921 阅读数 8348
• ###### matlab边缘检测和图像分割

matlab边缘检测 <img src="https://img-bss.csdn.net/201903190616489027.jpg" alt="" /></p>

7课时 101分钟 981人学习 刘昱显
免费试看

## 点检测

``````f = imread('test_pattern_with_single_pixel.tif');
w = [-1 -1 -1;-1 8 -1;-1 -1 -1];                    % 点检测掩模
g = abs(imfilter(double(f),w));
T = max(g(:));
g = g>=T;
subplot(1,2,1);imshow(f);title('原图像');
subplot(1,2,2);imshow(g);title('点检测');
``````

## 线检测

``````f = imread('wirebond_mask.tif');        % 图像大小：486×486
w = [2 -1 -1;-1 2 -1;-1 -1 2];          % -45°方向检测线
g = imfilter(double(f),w);
gtop = g(1:120,1:120);                  % 左上角区域
gtop = pixeldup(gtop,4);                % 通过复制像素将图像扩大gtop*4倍
gbot = g(end-119:end,end-119:end);      % 右下角区域
gbot = pixeldup(gbot,4);
g1 = abs(g);                             % 检测图的绝对值
T = max(g1(:));
g2 = g1>=T;

subplot(3,2,1);imshow(f);title('原图像');
subplot(3,2,2);imshow(g,[]);title('线检测-45°方向');
subplot(3,2,3);imshow(gtop,[]);title('左上角区域');
subplot(3,2,4);imshow(gbot,[]);title('右下角区域');
subplot(3,2,5);imshow(g1,[]);title('图像绝对值');
subplot(3,2,6);imshow(g2);title('g>=T');``````

使用Hough变换作线检测：

Hough变换是一种寻找并链接图像中线段的处理方式，用其进行线检测和链接的第一步是峰值检测。

## 边缘检测

``````f = imread('bld.tif');
[g_sobel_default,ts] = edge(f,'sobel');
[g_log_default,tlog] = edge(f,'log');
[g_canny_default,tc] = edge(f,'canny');

g_sobel_best = edge(f,'sobel',0.05);
g_log_best = edge(f,'log',0.003,2.25);
g_canny_best = edge(f,'canny',[0.04 0.10],1.5);

subplot(3,2,1);imshow(g_sobel_default);title('默认sobel');
subplot(3,2,2);imshow(g_sobel_best);title('默认log');
subplot(3,2,3);imshow(g_log_default);title('默认canny');
subplot(3,2,4);imshow(g_log_best);title('最佳sobel');
subplot(3,2,5);imshow(g_canny_default);title('最佳log');
subplot(3,2,6);imshow(g_canny_best);title('最佳canny');``````

## 三种图像处理的基本边缘检测法

2017-05-16 17:10:37 zhang_bei_qing 阅读数 11007
• ###### matlab边缘检测和图像分割

matlab边缘检测 <img src="https://img-bss.csdn.net/201903190616489027.jpg" alt="" /></p>

7课时 101分钟 981人学习 刘昱显
免费试看

1：直接对图像平滑滤波，之后利用sobel算子计算图像梯度，进行阈值处理，得到图像边缘图。这是最基本的边缘检测方法。效果当然一般般而且容易产生边缘断线。

2：Marr-Hildreth检测法，Marr和Hildreth两位前辈证明，

1)灰度变化和图像尺度无关（不管图像是大是小，比如将同一张图片进行缩放，他的边缘应该是不会改变的）,所以检测的时候要用不同尺寸的算子（比如大图片如果使用很小的算子，一条线容易变成一个区域被0像素隔开）。

2）灰度变化会在一阶导数引起波峰波谷，在二阶导数引起零交叉。

GaussianBlur(src, src, Size(3, 3), 1.5, 1.5);

Laplacian(src, dst, src.depth(), 3, 1, 0, BORDER_DEFAULT);

3：Canny算子也是用的最多的算子，先高斯滤波，在求梯度幅值图像，然后非最大值抑制，最后双阈值处理+连接分析进行连接边缘

Mat grayimg;

Mat flower = imread("D:/picture/orange.jpg");

cvtColor(flower, grayimg, COLOR_BGR2GRAY);

GaussianBlur(grayimg, grayimg, Size(5, 5), 2);

imshow("[高斯滤波]效果图", grayimg);
Canny(grayimg, grayimg, 30, 60);
imshow("[canny检测]算子的边缘检测", grayimg);

`由于边缘检测基本是用梯度算子完成的，梯度是在坐标（x，y）处指向f最大变化率的方向的向量，而彩色图像实际是由若干种原色（如RGB）构成的，如果直接检测彩色图像边缘也就是对每种色彩单独检测，但是各原色在一点处的梯度方向可能不同，从而得到的边缘也不同，会发生错误。要采用计算平均向量可以解决该问题但复杂性提高。`
```疑惑：在刚萨雷斯的书中，作者提示我们在选取高斯滤波模板（n*n）和标准差（σ）时应该使n为大于等于6σ的最小奇整数，但在实际用opencv函数Gaussianblur()进行效果检验的时候发现使n大于标准差的6倍效果并不是最好的，不知道作者这句话是什么意思。

----------------------分割线----------------------------------------------------------------------------

http://blog.csdn.net/abcjennifer/article/details/7639681/

```

## 【数字图像处理】Canny边缘检测详解及编程实现

2011-11-01 20:36:10 xiajun07061225 阅读数 55519
• ###### matlab边缘检测和图像分割

matlab边缘检测 <img src="https://img-bss.csdn.net/201903190616489027.jpg" alt="" /></p>

7课时 101分钟 981人学习 刘昱显
免费试看

Canny边缘检测算法一直是边缘检测的经典算法。下面详细介绍Canny边缘检测算法的原理以及编程实现。

Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件：一能有效地抑制噪声；二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度，得到最优化逼近算子。这就是Canny边缘检测算子。
(3)类似与Marr（LoG）边缘检测方法，也属于先平滑后求导数的方法。

Canny 的目标是找到一个最优的边缘检测算法，最优边缘检测的含义是：
(1)好的检测 - 算法能够尽可能多地标识出图像中的实际边缘。
(2)好的定位 - 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。
(3)最小响应 - 图像中的边缘只能标识一次，并且可能存在的图像雜訊不应标识为边缘。

Canny边缘检测算法的步骤

(1)去噪

(2)用一阶偏导的有限差分来计算梯度的幅值和方向。

(3)对梯度幅值进行非极大值抑制。

(4)用双阈值算法检测和连接边缘。

解决方法：双阈值算法。双阈值算法对非极大值抑制图象作用两个阈值τ1和τ2，且2τ1≈τ2，从而可以得到两个阈值边缘图象N1［i,j］和N2［i，j］。由于N2［i，j］使用高阈值得到，因而含有很少的假边缘，但有间断(不闭合)。双阈值法要在N2［i，j］中把边缘连接成轮廓，当到达轮廓的端点时，该算法就在N1［i,j］的8邻点位置寻找可以连接到轮廓上的边缘，这样，算法不断地在N1［i,j］中收集边缘，直到将N2［i,j］连接起来为止。

```I = imread('rice.png');
I = double(I);
[height,width] = size(I);
J = I;

conv = zeros(5,5);%高斯卷积核
sigma = 1;%方差
sigma_2 = sigma * sigma;%临时变量
sum = 0;
for i = 1:5
for j = 1:5
conv(i,j) = exp((-(i - 3) * (i - 3) - (j - 3) * (j - 3)) / (2 * sigma_2)) / (2 * 3.14 * sigma_2);%高斯公式
sum = sum + conv(i,j);
end
end
conv = conv./sum;%标准化

%对图像实施高斯滤波
for i = 1:height
for j = 1:width
sum = 0;%临时变量
for k = 1:5
for m = 1:5
if (i - 3 + k) > 0 && (i - 3 + k) <= height && (j - 3 + m) > 0 && (j - 3 + m) < width
sum = sum + conv(k,m) * I(i - 3 + k,j - 3 + m);
end
end
end
J(i,j) = sum;
end
end
figure,imshow(J,[])
title('高斯滤波后的结果')
%求梯度
dx = zeros(height,width);%x方向梯度
dy = zeros(height,width);%y方向梯度
d = zeros(height,width);
for i = 1:height - 1
for j = 1:width - 1
dx(i,j) = J(i,j + 1) - J(i,j);
dy(i,j) = J(i + 1,j) - J(i,j);
d(i,j) = sqrt(dx(i,j) * dx(i,j) + dy(i,j) * dy(i,j));
end
end
figure,imshow(d,[])
title('求梯度后的结果')

%局部非极大值抑制
K = d;%记录进行非极大值抑制后的梯度
%设置图像边缘为不可能的边缘点
for j = 1:width
K(1,j) = 0;
end
for j = 1:width
K(height,j) = 0;
end
for i = 2:width - 1
K(i,1) = 0;
end
for i = 2:width - 1
K(i,width) = 0;
end

for i = 2:height - 1
for j = 2:width - 1
%当前像素点的梯度值为0，则一定不是边缘点
if d(i,j) == 0
K(i,j) = 0;
else
%如果Y方向幅度值较大
grad2 = d(i - 1,j);
grad4 = d(i + 1,j);
%如果x、y方向导数符号相同
%像素点位置关系
%g1 g2
%   C
%   g4 g3
grad1 = d(i - 1,j - 1);
grad3 = d(i + 1,j + 1);
else
%如果x、y方向导数符号反
%像素点位置关系
%   g2 g1
%   C
%g3 g4
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
%如果X方向幅度值较大
else
grad2 = d(i,j - 1);
grad4 = d(i,j + 1);
%如果x、y方向导数符号相同
%像素点位置关系
%g3
%g4 C g2
%     g1
grad1 = d(i + 1,j + 1);
grad3 = d(i - 1,j - 1);
else
%如果x、y方向导数符号反
%像素点位置关系
%     g1
%g4 C g2
%g3
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
end
gradTemp1 = weight * grad1 + (1 - weight) * grad2;
gradTemp2 = weight * grad3 + (1 - weight) * grad4;
%当前像素的梯度是局部的最大值，可能是边缘点
else
%不可能是边缘点
K(i,j) = 0;
end
end
end
end
figure,imshow(K,[])
title('非极大值抑制后的结果')

%定义双阈值：EP_MIN、EP_MAX，且EP_MAX = 2 * EP_MIN
EP_MIN = 12;
EP_MAX = EP_MIN * 2;
EdgeLarge = zeros(height,width);%记录真边缘
EdgeBetween = zeros(height,width);%记录可能的边缘点
for i = 1:height
for j = 1:width
if K(i,j) >= EP_MAX%小于小阈值，不可能为边缘点
EdgeLarge(i,j) = K(i,j);
else if K(i,j) >= EP_MIN
EdgeBetween(i,j) = K(i,j);
end
end
end
end
%把EdgeLarge的边缘连成连续的轮廓
MAXSIZE = 999999;
Queue = zeros(MAXSIZE,2);%用数组模拟队列
front = 1;%队头
rear = 1;%队尾
edge = zeros(height,width);
for i = 1:height
for j = 1:width
if EdgeLarge(i,j) > 0
%强点入队
Queue(rear,1) = i;
Queue(rear,2) = j;
rear = rear + 1;
edge(i,j) = EdgeLarge(i,j);
EdgeLarge(i,j) = 0;%避免重复计算
end
while front ~= rear%队不空
%队头出队
temp_i = Queue(front,1);
temp_j = Queue(front,2);
front = front + 1;
%8-连通域寻找可能的边缘点
%左上方
if EdgeBetween(temp_i - 1,temp_j - 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j - 1) = K(temp_i - 1,temp_j - 1);
EdgeBetween(temp_i - 1,temp_j - 1) = 0;%避免重复计算
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正上方
if EdgeBetween(temp_i - 1,temp_j) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j) = K(temp_i - 1,temp_j);
EdgeBetween(temp_i - 1,temp_j) = 0;
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
%右上方
if EdgeBetween(temp_i - 1,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i - 1,temp_j + 1) = K(temp_i - 1,temp_j + 1);
EdgeBetween(temp_i - 1,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i - 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
%正左方
if EdgeBetween(temp_i,temp_j - 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i,temp_j - 1) = K(temp_i,temp_j - 1);
EdgeBetween(temp_i,temp_j - 1) = 0;
%入队
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正右方
if EdgeBetween(temp_i,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i,temp_j + 1) = K(temp_i,temp_j + 1);
EdgeBetween(temp_i,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
%左下方
if EdgeBetween(temp_i + 1,temp_j - 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j - 1) = K(temp_i + 1,temp_j - 1);
EdgeBetween(temp_i + 1,temp_j - 1) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j - 1;
rear = rear + 1;
end
%正下方
if EdgeBetween(temp_i + 1,temp_j) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j) = K(temp_i + 1,temp_j);
EdgeBetween(temp_i + 1,temp_j) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j;
rear = rear + 1;
end
%右下方
if EdgeBetween(temp_i + 1,temp_j + 1) > 0%把在强点周围的弱点变为强点
EdgeLarge(temp_i + 1,temp_j + 1) = K(temp_i + 1,temp_j + 1);
EdgeBetween(temp_i + 1,temp_j + 1) = 0;
%入队
Queue(rear,1) = temp_i + 1;
Queue(rear,2) = temp_j + 1;
rear = rear + 1;
end
end
%下面2行用于观察程序运行的状况
i
j
end
end

figure,imshow(edge,[])
title('双阈值后的结果')```

## 【图像处理】 常用边缘检测算法对比分析

2018-01-19 23:08:12 KYJL888 阅读数 57037
• ###### matlab边缘检测和图像分割

matlab边缘检测 <img src="https://img-bss.csdn.net/201903190616489027.jpg" alt="" /></p>

7课时 101分钟 981人学习 刘昱显
免费试看

1)  差分边缘检测

f(i+1,j)-f(i,j)                          (2.3.1)

Y轴方向上的一阶差分定义为：

f(i,j+1)-f(i,j)       (2.3.2)

2）Reborts算子

Reboerts算子是一种利用局部差分来寻找边缘的算子，Roberts 梯度算子所采用的是对角方向相邻两像素值之差，算子形式如下：

Gx = f(i,j) - f(i-1,j-1)           (2.3.3)
Gy = f(i-1,j) - f(i,j-1)           (2.3.4)
|G(x,y)| = sprt(Gx^2-Gy^2)         (2.3.5)

Roberts梯度算子对应的卷积模版为：

Roberts算子采用对角线方向相邻两像素之差近似梯度幅值检测边缘。检测水平和垂直边缘的效果好于斜向边缘，定位精度高，对噪声敏感

3）Sobel算子

Sobel算子在边缘检测算子扩大了其模版，在边缘检测的同时尽量削弱了噪声。其模版大小为3×3，其将方向差分运算与局部加权平均相结合来提取边缘。在求取图像梯度之前，先进行加权平均，然后进行未分，加强了对噪声的一致。Sobel算子所对应的卷积模版为：

图像中的每个像素点和以上水平和垂直两个卷积算子做卷积运算后，再计算得到

——————————————————————————————————

Sobel卷积因子为：

Gx = (-1)*f(x-1, y-1) + 0*f(x,y-1) + 1*f(x+1,y-1)

+(-2)*f(x-1,y) + 0*f(x,y)+2*f(x+1,y)

+(-1)*f(x-1,y+1) + 0*f(x,y+1) + 1*f(x+1,y+1)

= [f(x+1,y-1)+2*f(x+1,y)+f(x+1,y+1)]-[f(x-1,y-1)+2*f(x-1,y)+f(x-1,y+1)]

Gy =1* f(x-1, y-1) + 2*f(x,y-1)+ 1*f(x+1,y-1)

+0*f(x-1,y) 0*f(x,y) + 0*f(x+1,y)

+(-1)*f(x-1,y+1) + (-2)*f(x,y+1) + (-1)*f(x+1, y+1)

= [f(x-1,y-1) + 2f(x,y-1) + f(x+1,y-1)]-[f(x-1, y+1) + 2*f(x,y+1)+f(x+1,y+1)]

Sobel算子根据像素点上下、左右邻点灰度加权差，在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用，提供较为精确的边缘方向信息，边缘定位精度不够高。当对精度要求不是很高时，是一种较为常用的边缘检测方法。

——————————————————————————

4）Prewitt 算子

Prewitt 算子通过对图像上的每个像素点的八方向邻域的灰度加权差之和来进行检测边缘，对噪声有一定抑制作用，抗噪性较好，但由于采用了局部灰度平均，因此容易检测出伪边缘，并且边缘定位精度较低。
——————————————————————————————————————

sobel边缘检测外 还有Prewitt算子， 它的卷积因子如下：

Prewitt算子利用像素点上下、左右邻点灰度差，在边缘处达到极值检测边缘。对噪声具有平滑作用，定位精度不够高。

G(x,y)=abs(f(x,y)-f(x+1,y+1))+abs(f(x,y+1)-f(x+1,y))

——————————————————————
5）Kirsch 算子
Kirsch 算子是一种 3×3 的非线性方向算子。其基本思想是希望改进取平均值的过程，从而尽量使边缘两侧的像素各自与自己同类的像素取平均值，然后再求平均值之差，来减小由于取平均值所造成的边缘细节丢失。通常采用八方向 Kirsch 模板的方法进行检测，取其中最大的值作为边缘强度，而将与之对应的方向作为边缘方向。常用的八方向 Kirsch 模板如下所示：

6）Laplace 算子

将这两个式子合并，可以得到近似Laplace算子的模版：

7）LOG算子（高斯拉普拉斯算子）
LOG算子基本思想是：先在一定的范围内做平滑滤波，然后再利用差分算子来检测在相应尺度上的边缘。滤波器的选择要考虑以下两个因素：其一是滤波器在空间上要求平稳，即要求空间位置误差 Δ x要小；其二是平滑滤波器本身要求是带通滤波器，并且在有限的带通内是平稳的，即要求频域误差 Δω 要小。根据信号处理中的测不准原理， Δx 和 Δ ω是相互矛盾的，而达到测不准下限的滤波器就是高斯滤波器。Marr 和 Hildreth 提出的这种差分算子是各向同性的拉普拉斯二阶差分算子。该边缘检测器的基本特征是：
（1） 所用的平滑滤波器是高斯滤波器
（2） 增强步骤采用的是二阶导数（即二维拉普拉斯函数）
（3） 边缘检测的判据是二阶导数过零点并且对应一阶导数的极大值

8） Canny算子
1986年，Canny从边缘检测算子应该满足的三个准则出发，推导出了最优边

Canny提出的评价边缘检测性能优劣的三个准则分别是:
（1）好的信噪比准则。即将非边缘点判为边缘点的概率要低，将边缘点判为非边缘点的概率要低;
（2）好的定位性能准则。即检测出的边缘点要尽可能在实际边缘的中心;
（3）单边缘响应准则。即单一边缘具有唯一响应，单一边缘产生的多个响

（1）用式所示的高斯函数h(r)对图像进行平滑滤波，去除图像中的噪声。
（2）在每一点计算出局部梯度和边缘方向，可以利用Sobel算子、Roberts算子等来计算。边缘点定义为梯度方向上其强度局部最大的点。
（3）对梯度进行“非极大值抑制”。在第二步中确定的边缘点会导致梯度幅度图像中出现脊。然后用算法追踪所有脊的顶部，并将所有不在脊的顶部的像素设为零，以便在输出中给出一条细线。
（4）双阐值化和边缘连接。脊像素使用两个闽值Tl和竹做阂值处理，其中Tl<T2.值大于竹的脊像素称为强边缘像素，Tl和T2之间的脊像素称为弱边缘像素。由于边缘阵列孔是用高闽值得到的，因此它含有较少的假边缘，但同时也损失了一些有用的边缘信息。而边缘阵列Tl的闽值较低，保留了较多信息。因此，可以以边缘阵列几为基础，用边缘阵列Tl进行补充连接，最后得到边缘图像。
Canny算子也存在不足之处:
（1）为了得到较好的边缘检测结果，它通常需要使用较大的滤波尺度，这样容易丢失一些细节
（2）Canny算子的双阈值要人为的选取，不能够自适应

其他博文参照http://wenku.baidu.com/view/ce3aa547be1e650e52ea9945.html

## 1.1   Roberts算子

Roberts算子是一种利用局部差分算子寻找边缘的算子，它有下式给出：

x,y)=

Roberts算子是2X2算子模板。图1所示的2个卷积核形成了Roberts算子。图象中的每一个点都用这2个核做卷积。

 1 0 0 -1
 0 1 -1 0

1    Roberts算子

1.2    Sobel算子

Sobel算子是一种一阶微分算子，它利用像素邻近区域的梯度值来计算1个像素的梯度，然后根据一定的绝对值来取舍。它由下式给出:

Sobel算子是3*3算子模板。图2所示的2个卷积核dx  dy形成Sobel算子。一个核对通常的垂直边缘响应最大，而另一个核对水平边缘响应最大。2个卷积的最大值作为该点的输出值。运算结果是一幅边缘幅度图像。

 -1 0 1 -2 0 2 -1 0 1
 1 2 1 0 0 0 -1 -2 -1

2      Sobel算子

Prewitt算子

Prewitt算子由下式给出：

Prewitt算子是3*3算子模板。图3所示的2个卷积核dx ,dy.形成了Prewitt算子。与Sobel算子的方法一样，图像中的每个点都用这2个核进行卷积，取最大值作为输出值。Prewitt算子也产生一幅边缘幅度图像。

 -1 0 1 -1 0 1 -1 0 1
 1 1 1 0 0 0 -1 -1 -1

1.3 Canny算子

Canny算子是是一阶算子。其方法的实质是用1个准高斯函数平滑运算fs=f(x,y)*G(x,y),然后以带方向的一阶微分算子定位导数最大值

平滑后fs(xy)的梯度可以使用2*2的一阶有限差分近似式:

P[i,j]≈(fs[i,j+1]-fs[i,j]+fs[i+1,j+1]-fs[i+1,j])/2

Q[i,j] ≈(fs[i,j]-fs[i+1,j]+fs[i,j+1]-fs[i+1,j+1])/2

M[i,j]=

M[i,j]反映了图象的边缘强度;反映了边缘的方向。使得M}i,j}取得局部最大值的方向角，就反映了边缘的方向。

Canny算子也可用高斯函数的梯度来近似，在理论上很接近4个指数函数的线性组合形成的最佳边缘算子。在实际工作应用中编程较为复杂且运算较慢。

## 2.1 LOG滤波器

LOG滤波器又称Marr-Hildreth模板或算子

=

h(x,y)=G(x,y)

LOG滤波器有以下特点:

(1)通过图象平滑，消除了一切尺度小于σ的图像强度变化;

(2)若用其它微分法，需要计算不同方向的微分，而它无方向性，因此可以节省计算量;

(3)它定位精度高，边缘连续性好，可以提取对比度较弱的边缘点。

LOG滤波器也有它的缺点:当边缘的宽度小于算子宽度时，由于过零点的斜坡融合将会丢失细节。

LOG滤波器有无限长的拖尾，若取得很大尺寸，将使得计算不堪重负。但随着:r=的增加，LOG滤波器幅值迅速下降，当r大于一定程度时，可以忽略模板的作用，这就为节省计算量创造了条件。实际计算时，常常取n* n大小的LOG滤波器，近似n=3σ。另外，LOG滤波器可以近似为两个指数函数之差，即DOG ( Difference Of two Gaussians functions):

DOG（σ1，σ2）=-

σ1/σ2=1.6时，DOG代替LOG减少了计算量。

Robert算子定位比较精确，但由于不包括平滑，所以对于噪声比较敏感。

Prewitt算子和Sobel算子都是一阶的微分算子，而前者是平均滤波，后者是加权平均滤波且检测的图像边缘可能大于2个像素。这两者对灰度渐变低噪声的图像有较好的检测效果，但是对于混合多复杂噪声的图像，处理效果就不理想了。

LOG滤波器方法通过检测二阶导数过零点来判断边缘点。LOG滤波器中的a正比于低通滤波器的宽度，a越大平滑作用越显著，去除噪声越好，但图像的细节也损失越大，边缘精度也就越低。所以在边缘定位精度和消除噪声级间存在着矛盾，应该根据具体问题对噪声水平和边缘点定位精度要求适当选取。

## 图像处理中边缘检测和轮廓检测的区别

2016-09-03 15:58:29 NNNNNNNNNNNNY 阅读数 13128
• ###### matlab边缘检测和图像分割

matlab边缘检测 <img src="https://img-bss.csdn.net/201903190616489027.jpg" alt="" /></p>

7课时 101分钟 981人学习 刘昱显
免费试看

1. http://wangmurong.org.cn/2015/10/21/edge-detection-segmentation-contour-detection/
2. Opencv官方例程中的contours2.cpp
3. 《OpenCV3编程入门》 浅墨_毛星云