1. Canny介绍

Canny算子与Marr(LoG)边缘检测方法类似,也属于是先平滑后求导数的方法。John Canny研究了最优边缘检测方法所需的特性,给出了评价边缘检测性能优劣的三个指标:

1  好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概率要低;

2  高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;

3  对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边缘应该得到最大抑制。

2. Canny检测实现过程

第一步:灰度化

第二步:高斯滤波

首先生成二维高斯分布矩阵:

然后与灰度图像进行卷积实现滤波:

第三步:计算梯度值和方向

求变化率时,对于一元函数,即求导;对于二元函数,求偏导。 数字图像处理中,用一阶有限差分近似求取灰度值的梯度值(变化率)。

(即:使差商(Δf/Δx)近似取代微商(∂f/∂x)。求灰度的变化率,分别取x和y方向上相邻像素做差,代替求取x和y

方向一阶偏导) 。

其中f为图像灰度值,P代表X方向梯度幅值,Q代表Y方向 梯度幅值,M是该点幅值,Θ是梯度方向,也就是角度。

注:图像梯度方向与边缘方向互相垂直:

第四步:非极大值抑制(NMS)

通俗意义上是指寻找像素点局部最大值。沿着梯度方向,比较它前面和后面的梯度值。在沿其方向上邻域的梯度幅值最大,则保留;否则,抑制。

可以进行插值来提高结果。

第五步:双阈值的选取、边缘连接

选取高阈值T H 和低阈值T L ,比率为2:1或3:1。(一般取TH=0.3或0.2, TL=0.1)

取出非极大值抑制后的图像中的最大梯度幅值,重新定义高低阈值。即:T H ×Max,T L ×Max 。(当然可以自己给定)

将小于TL 的点抛弃,赋0;将大于T H 的点立即标记(这些点就是边缘点),赋1。

将大于TL ,小于TH 的点使用8连通区域确定(即:只有与TH像素连接时才会被接受,成为边缘点,赋1) 。

3. Canny检测Python实现

具体实现略有不同,例如:

高斯矩阵的实现过程、梯度幅值的实现过程、非极大值抑制的角度选取(可以选0,45,90,135)、边缘检测的实现过程。

#-*- coding: utf-8 -*-

"""Created on Thu Dec 7 21:12:41 2017

@author: L.P.S"""

importmatplotlib.pyplot as pltimportnumpy as npimportmath

img= plt.imread('G:\\360downloads\\lps.png')

sigma1= sigma2 = 1sum=0

gaussian= np.zeros([5, 5])for i in range(5):for j in range(5):

gaussian[i,j]= math.exp(-1/2 * (np.square(i-3)/np.square(sigma1) #生成二维高斯分布矩阵+ (np.square(j-3)/np.square(sigma2)))) / (2*math.pi*sigma1*sigma2)

sum= sum +gaussian[i, j]

gaussian= gaussian/sum#print(gaussian)

defrgb2gray(rgb):return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])#step1.高斯滤波

gray =rgb2gray(img)

W, H=gray.shape

new_gray= np.zeros([W-5, H-5])for i in range(W-5):for j in range(H-5):

new_gray[i,j]= np.sum(gray[i:i+5,j:j+5]*gaussian) # 与高斯矩阵卷积实现滤波#plt.imshow(new_gray, cmap="gray")

#step2.增强 通过求梯度幅值

W1, H1 =new_gray.shape

dx= np.zeros([W1-1, H1-1])

dy= np.zeros([W1-1, H1-1])

d= np.zeros([W1-1, H1-1])for i in range(W1-1):for j in range(H1-1):

dx[i,j]= new_gray[i, j+1] -new_gray[i, j]

dy[i,j]= new_gray[i+1, j] -new_gray[i, j]

d[i, j]= np.sqrt(np.square(dx[i,j]) +np.square(dy[i,j])) # 图像梯度幅值作为图像强度值#plt.imshow(d, cmap="gray")

#setp3.非极大值抑制 NMS

W2, H2 =d.shape

NMS=np.copy(d)

NMS[0,:]= NMS[W2-1,:] = NMS[:,0] = NMS[:, H2-1] =0for i in range(1, W2-1):for j in range(1, H2-1):if d[i, j] ==0:

NMS[i, j]=0else:

gradX=dx[i, j]

gradY=dy[i, j]

gradTemp=d[i, j]#如果Y方向幅度值较大

if np.abs(gradY) >np.abs(gradX):

weight= np.abs(gradX) /np.abs(gradY)

grad2= d[i-1, j]

grad4= d[i+1, j]#如果x,y方向梯度符号相同

if gradX * gradY >0:

grad1= d[i-1, j-1]

grad3= d[i+1, j+1]#如果x,y方向梯度符号相反

else:

grad1= d[i-1, j+1]

grad3= d[i+1, j-1]#如果X方向幅度值较大

else:

weight= np.abs(gradY) /np.abs(gradX)

grad2= d[i, j-1]

grad4= d[i, j+1]#如果x,y方向梯度符号相同

if gradX * gradY >0:

grad1= d[i+1, j-1]

grad3= d[i-1, j+1]#如果x,y方向梯度符号相反

else:

grad1= d[i-1, j-1]

grad3= d[i+1, j+1]

gradTemp1= weight * grad1 + (1-weight) *grad2

gradTemp2= weight * grad3 + (1-weight) *grad4if gradTemp >= gradTemp1 and gradTemp >=gradTemp2:

NMS[i, j]=gradTempelse:

NMS[i, j]=0#plt.imshow(NMS, cmap = "gray")

#step4. 双阈值算法检测、连接边缘

W3, H3 =NMS.shape

DT=np.zeros([W3, H3])#定义高低阈值

TL = 0.2 *np.max(NMS)

TH= 0.3 *np.max(NMS)for i in range(1, W3-1):for j in range(1, H3-1):if (NMS[i, j]

DT[i, j]=0elif (NMS[i, j] >TH):

DT[i, j]= 1

elif ((NMS[i-1, j-1:j+1] < TH).any() or (NMS[i+1, j-1:j+1]).any()or (NMS[i, [j-1, j+1]]

DT[i, j]= 1plt.imshow(DT, cmap= "gray")

4. 实验结果

原图                                                       双阈值:0.1*max, 0.3*max                                双阈值:0.2*max, 0.3*max

参考:

python canny_canny 算子python实现相关推荐

  1. Pass算子python 函数

    Pass算子python 函数 函数 • 函数是代码的一种组织形式 • 函数应该能完成一项特定的工作,而且一般一个函数只完成一项工作 • 有些语言,分函数和过程两个概念,通俗解释是,有返回结果的是函数 ...

  2. python低通滤波器_[Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波

    [Python图像处理] 二十三.傅里叶变换之高通滤波和低通滤波 发布时间:2019-04-28 20:35, 浏览次数:2739 , 标签: Python 该系列文章是讲解Python OpenCV ...

  3. 初学必备,30个极简Python代码,python必背入门代码

    前言 1.重复元素判定 以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素. (文末有读者福利) def all_unique(lst): return len( ...

  4. Python培训:Python有哪些函数?你了解几种?

    本期小编要为大家带来的Python教程就是关于Python函数这方面的,我们都知道Python函数,一般是指组织好的.可重复使用的.用来实现单一或相关联功能的代码段,Python函数包含系统中自带的一 ...

  5. python新手任务:python循环嵌套

    2019独角兽企业重金招聘Python工程师标准>>> Python 循环嵌套 Python 语言允许在一个循环体里面嵌入另一个循环. Python for 循环嵌套语法: Pyth ...

  6. Python入门 Python自学路线 Python如何学习

    本文介绍Python入门 Python自学路线 Python如何学习.先说点题外话吧:首先呢,我刚开始接触编程的时候,学的是C,那时候Python还没有这么火,后来学了C++,PHP,Java,前端. ...

  7. 黑客都用Python?学习Python的4个理由!

    2019独角兽企业重金招聘Python工程师标准>>> Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. 重点是,Python 是一种对初学者非常友好的 ...

  8. python 3 最佳python中文书籍下载

    筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. 尽量只收集通用的书籍,专用的书籍只收集特别优秀者. python专业书籍汇总 Python基础教程(第3版) - 2017.pdf 图 ...

  9. 【循序渐进学Python】1. Python基础知识

    1. Python安装和配置 首先需要到Python的官方网站(http://www.python.org/getit/) 下载安装包,现在Python的发行版分为兼容之前Python程序的Pytho ...

最新文章

  1. Android 面试系列 Dn.1---- Service?
  2. json中的转义字符和数字
  3. c语言文本按行分配数组元素,【转】C语言中动态分配数组
  4. 教师计算机应用测试题,教师计算机等级考试模拟考试题演示教学
  5. Flink 实战:如何解决应用中的技术难题?
  6. Android之如何设置背景的透明度
  7. Android 10正式版发布,支持5G和折叠屏设备
  8. Java——常用类(String)
  9. 【Oracle Database】Oracle GoldenGate (single-single)
  10. 【前端_React】React小书
  11. python获取windows窗口的内容_Python实现遍历windows所有窗口并输出窗口标题的方法...
  12. 树莓派4B安装系统及开热点
  13. 小学生趣味C++编程第27课 老狼老狼几点钟
  14. 170虚拟sim服务器,虚拟大容量SIM卡服务器端管理软件的设计与现实
  15. 浏览器修改主页不失效,打开浏览器弹出首页修改方法
  16. 阿翔编程学-爱情感言
  17. 洛谷P2598 [ZJOI2009]狼和羊的故事 题解
  18. Photoshop CS 中的“照片滤镜/Photo Filter”命令详解(转)
  19. vi/vim编辑器入门
  20. 【抢鲜体验 】DAYU200更多样例来袭

热门文章

  1. 计算机学校招生要求高吗,计算机应用技术学校招生要求
  2. 什么是jsp,对于jsp的详细理解
  3. scrcpy投屏工具的在harmonyOS开发上的使用
  4. 什么是单例模式,懒汉式和饿汉式使用方式
  5. TCP协议:三次握手过程详解
  6. JavaWeb程序的src和webXXX下的文件和包都是什么意思
  7. 计算机应用技能大赛主持词,有关于开学典礼的主持词范文
  8. C语言运算符优先级(大全)
  9. 住在我隔壁的一对大学生夫妻(九)
  10. UE5接入在线直播视频源,如hls(m3u8)格式