算法解剖系列-Canny边缘检测原理及实现
来源:互联网 发布:python 退火算法 编辑:程序博客网 时间:2024/05/21 19:47
基本原理
- 须满足条件:抑制噪声;精确定位边缘。
- 从数学上表达了三个准则[信噪比准则(低错误率)、定位精度准则、单边缘响应准则],并寻找表达式的最佳解。
- 属于先平滑后求导的方法。
算法基本步骤
1、 使用高斯滤波平滑图像
令
Guess过程
- 用坐标点
(x,y)表示一个3×3的邻域,设中心点的坐标为(0,0) ,相邻的点以此类推。
计算权重矩阵。设定方差
σ2=0.64 的值,将对应各个坐标点(x,y) 带入二维高斯公式G(x,y) 中,得到一个权重矩阵,归一化权重矩阵(矩阵中各个点除以权重之和),得到标准的权重矩阵,即高斯模板。计算高斯模糊。设在一幅图像中的
3×3 区域内,用各像素点的灰度值乘以对应点的权重。- 将得到的9个值求和,就是中心点的高斯模糊值。
具体过程:http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
卷积过程
- 简单来说就是使用
Guess 模板在原始图像中进行移位、相乘、相加的过程。
2、 计算梯度的幅值图像,角度图像
补充:求变化率时,对于一元函数,即求导;对于二元函数,求偏导。
数字图像处理中,用一阶有限差分近似求取灰度值的梯度值(变化率)。
(即:使差商
例:计算一点
上图中显示一段直的边缘线段放大后一部分,每个方块代表一个像素点,用一个方框强调点处边缘的幅值和方向。令灰色像素值为
如图关于一点为中心的
根据
由此,可以得到该点梯度的幅值和方向:
如下图表示了中心点的梯度向量、方位角以及边缘方向。(任一点的边缘与梯度向量正交)
注意:
gx,gy,M(x,y)和α(x,y)都是与原图像大小相同的图像。 α(x,y)是为了确定梯度的方向,以及确定非极大值抑制时的对比方向; M(x,y)用来确定是否为边缘点,幅值越大,表示像素区域灰度值变化越明显,更能代表边缘点.
3、 对幅值图像进行应用非极大值抑制
- 首先将角度划分成四个方向范围:水平
(0°)、−45°、垂直(90°)、+45° 。如下图:
- 接着讨论对
3×3 区域的四个基本边缘方向进行非极大值抑制。
做法:若中心点(即:访问点)在沿其方向上邻域的梯度幅值最大,则保留;否则,抑制。
4、 双阈值检测和连接边缘
- 选取高阈值
TH和低阈值TL,比率为2:1或3:1。(一般取TH=0.3/0.2,TL=0.1 ) - 取出非极大值抑制后的图像中的最大梯度幅值,重新定义高低阈值。即:
TH×Max,TL×Max 。(当然可以自己给定) 将小于TL的点抛弃,赋0;将大于TH的点立即标记(这些点就是边缘点),赋1。 将大于TL,小于TH的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋1) 。
注意:双阈值做法是将候选像素点拼接成轮廓,轮廓的形成时对这些像素运用滞后性阈值。
算法实现
Matlab代码
clear all;clc;I = imread('rice.png');%读图% I = rgb2gray(I);%灰度转换I = double(I);%转化为双精度[H,W] = size(I);%获取图像大小%% Step1:使用高斯滤波平滑图像B = [1 2 1;2 4 2;1 2 1];%高斯滤波系数B = 1/16.*B;%高斯滤波模板 方差=0.8A = conv2(I,B,'same');%使用高斯模板进行卷积.计算二维卷积,结果与原图像大小相同 %% Step2:计算梯度的幅值图像,角度图像.%Prewitt梯度模板dx = [-1 0 1;-1 0 1;-1 0 1];%x方向的梯度模板dy = [1 1 1; 0 0 0;-1 -1 -1];%y方向的梯度模板gx = conv2(A,dx,'same');%获取x方向的梯度图像.使用梯度模板进行二维卷积,结果与原图像大小相同gy = conv2(A,dy,'same');%获取y方向的梯度图像.使用梯度模板进行二维卷积,结果与原图像大小相同M = sqrt((gx.^2) + (gy.^2));%获取幅值图像.大小与原图像相等.(.^)表示数组乘方a = atan2(gy,gx);%获取弧度,范围:-pi~pia = a*180/pi;%将弧度转换为角度,得到角度图像,与原图像大小相等.%% Step3:对幅值图像进行应用非极大值抑制%首先将角度划分成四个方向范围:水平(0°)、-45°、垂直(90°)、+45°for i = 1:H for j = 1:W if((a(i,j) >= -22.5) && (a(i,j) < 0)||(a(i,j) >= 0) && (a(i,j) < 22.5) || (a(i,j) <= -157.5) && (a(i,j) >= -180)||(a(i,j) >= 157.5)&&(a(i,j) <= 180)) a(i,j) = 0; elseif((a(i,j) >= 22.5) && (a(i,j) < 67.5) || (a(i,j) <= -112.5) && (a(i,j) > -157.5)) a(i,j) = -45; elseif((a(i,j) >= 67.5) && (a(i,j) < 112.5) || (a(i,j) <= -67.5) && (a(i,j) >- 112.5)) a(i,j) = 90; elseif((a(i,j) >= 112.5) && (a(i,j) < 157.5) || (a(i,j) <= -22.5) && (a(i,j) > -67.5)) a(i,j) = 45; end endend%讨论对3x3区域的四个基本边缘方向进行非极大值抑制.获取非极大值抑制图像Nms = zeros(H,W);%定义一个非极大值图像for i = 2:H-1 for j= 2:W-1 if (a(i,j) == 0 && M(i,j) == max([M(i,j), M(i,j+1), M(i,j-1)])) Nms(i,j) = M(i,j); elseif (a(i,j) == -45 && M(i,j) == max([M(i,j), M(i+1,j-1), M(i-1,j+1)])) Nms(i,j) = M(i,j); elseif (a(i,j) == 90 && M(i,j) == max([M(i,j), M(i+1,j), M(i-1,j)])) Nms(i,j) = M(i,j); elseif (a(i,j) == 45 && M(i,j) == max([M(i,j), M(i+1,j+1), M(i-1,j-1)])) Nms(i,j) = M(i,j); end; end;end;%% Step4:双阈值检测和连接边缘DT = zeros(H,W);%定义一个双阈值图像TL = 0.1 * max(max(Nms));%低阈值TH = 0.3 * max(max(Nms));%高阈值for i = 1 : H for j = 1 : W if (Nms(i, j) < TL) DT(i,j) = 0; elseif (Nms(i, j) > TH) DT(i,j) = 1 ; %对TL < Nms(i, j) < TH 使用8连通区域确定 elseif ( Nms(i+1,j) > TH || Nms(i-1,j) > TH || Nms(i,j+1) > TH || Nms(i,j-1) > TH || Nms(i-1, j-1) > TH || Nms(i-1, j+1) > TH || Nms(i+1, j+1) > TH || Nms(i+1, j-1) > TH) DT(i,j) = 1; end; end;end;figure, imshow(DT); %最终的边缘检测为二值图像
效果图
6 0
- 算法解剖系列-Canny边缘检测原理及实现
- Canny边缘检测原理及C++实现
- Canny边缘检测算法原理
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现详解(一)
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现详解(一)
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现详解(一)
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现
- Canny边缘检测算法原理及其VC实现详解
- OpenCV: Canny边缘检测算法原理及其VC实现详解
- Canny边缘检测算法原理及其VC实现详解(一)
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现详解(三)
- Canny边缘检测算法原理及其VC实现详解(二)
- Canny边缘检测算法原理及其VC实现详解(一)
- cqm解题报告F
- Commit failed with error: did not match any file(s) known to git. 解决办法
- hdu 2795 Billboard(线段树)
- linux备份数据库
- pi ocr 及二维码识别
- 算法解剖系列-Canny边缘检测原理及实现
- HDU 3853 LOOPS 概率dp
- SICP ex1-30 ex1-31
- 如何判断text-overflow: ellipsis???
- 【总结】利用AWS搭建混合云的架构
- Ubuntu 下android 开发遇到的各种问题
- static 关键字小解
- @Controller和@RestController的区别?
- 欢迎使用CSDN-markdown编辑器