我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢

如果需要检测到图像里面的边缘,首先我们需要知道边缘处具有什么特征。

对于一幅灰度图像来说,边缘两边的灰度值肯定不相同,这样我们才能分辨出哪里是边缘,哪里不是。

因此,如果我们需要检测一个灰度图像的边缘,我们需要找出哪里的灰度变化最大。显然,灰度变化越大,对比度越强,边缘就越明显。

那么问题来了,我们怎么知道哪里灰度变化大,哪里灰度变化小呢?

导数,梯度,边缘信息

在数学中,与变化率有关的就是导数。

如果灰度图像的像素是连续的(实际不是),那么我们可以分别原图像G对x方向和y方向求导数

获得x方向的导数图像Gx和y方向的导数图像Gy。Gx和Gy分别隐含了x和y方向的灰度变化信息,也就隐含了边缘信息。

如果要在同一图像上包含两个方向的边缘信息,我们可以用到梯度。(梯度是一个向量)

原图像的梯度向量Gxy为(Gx,Gy),梯度向量的大小和方向可以用下面两个式子计算

角度值好像需要根据向量所在象限不同适当+pi或者-pi。

梯度向量大小就包含了x方向和y方向的边缘信息。

图像导数

实际上,图像矩阵是离散的。

连续函数求变化率用的是导数,而离散函数求变化率用的是差分。

差分的概念很容易理解,就是用相邻两个数的差来表示变化率。

下面公式是向后差分

x方向的差分:Gx(n,y) = G(n,y)-G(n-1,y)

y方向的差分:Gy(x,n) = G(x,n)-G(x,n-1)

实际计算图像导数时,我们是通过原图像和一个算子进行卷积来完成的(这种方法是求图像的近似导数)。

最简单的求图像导数的算子是Prewitt算子:

x方向的Prewitt算子为

y方向的Prewitt算子为

---------------------------------------------

原图像和一个算子进行卷积的大概过程如下

如果图像矩阵中一块区域为

那么x5处的x方向的导数是,将x方向算子的中心和x5重合,然后对应元素相乘再求和,即

x5处的x方向导数为x3+x6+x9-x1-x4-x7

对矩阵中所有元素进行上述计算,就是卷积的过程。

--------------------------------------------

因此,利用原图像和x方向Prewitt算子进行卷积就可以得到图像的x方向导数矩阵Gx,

利用原图像和y方向Prewitt算子进行卷积就可以得到图像的y方向导数矩阵Gy。

利用公式

就可以得到图像的梯度矩阵Gxy,这个矩阵包含图像x方向和y方向的边缘信息。

Python实现卷积及Prewitt算子的边缘检测

首先我们把图像卷积函数封装在一个名为imconv的函数中

importnumpy as npfrom PIL importImagedefimconv(image_array,suanzi):‘‘‘计算卷积

参数

image_array 原灰度图像矩阵

suanzi 算子

返回

原图像与算子卷积后的结果矩阵‘‘‘image= image_array.copy() #原图像矩阵的深拷贝

dim1,dim2=image.shape#对每个元素与算子进行乘积再求和(忽略最外圈边框像素)

for i in range(1,dim1-1):for j in range(1,dim2-1):

image[i,j]= (image_array[(i-1):(i+2),(j-1):(j+2)]*suanzi).sum()#由于卷积后灰度值不一定在0-255之间,统一化成0-255

image = image*(255.0/image.max())#返回结果矩阵

return image

然后我们利用Prewitt算子计算x方向导数矩阵Gx,y方向导数矩阵Gy,和梯度矩阵Gxy。

importnumpy as npimportmatplotlib.pyplot as plt#x方向的Prewitt算子

suanzi_x = np.array([[-1, 0, 1],

[-1, 0, 1],

[-1, 0, 1]])#y方向的Prewitt算子

suanzi_y = np.array([[-1,-1,-1],

[ 0, 0, 0],

[1, 1, 1]])#打开图像并转化成灰度图像

image = Image.open("pika.jpg").convert("L")#转化成图像矩阵

image_array =np.array(image)#得到x方向矩阵

image_x =imconv(image_array,suanzi_x)#得到y方向矩阵

image_y =imconv(image_array,suanzi_y)#得到梯度矩阵

image_xy = np.sqrt(image_x**2+image_y**2)#梯度矩阵统一到0-255

image_xy = (255.0/image_xy.max())*image_xy#绘出图像

plt.subplot(2,2,1)

plt.imshow(image_array,cmap=cm.gray)

plt.axis("off")

plt.subplot(2,2,2)

plt.imshow(image_x,cmap=cm.gray)

plt.axis("off")

plt.subplot(2,2,3)

plt.imshow(image_y,cmap=cm.gray)

plt.axis("off")

plt.subplot(2,2,4)

plt.imshow(image_xy,cmap=cm.gray)

plt.axis("off")

plt.show()

Prewitt算子的结果如下图所示

上方:左图为原图像,右图为x方向导数图像

下方:左图为y方向导数图像,右图为梯度图像

从图中可以看出,Prewitt算子虽然能检测出图像边缘,但是检测结果较为粗糙,还带有大量的噪声。

近似导数的Sobel算子

Sobel算子与Prewitt比较类似,但是它比Prewitt算子要好一些。

x方向的Sobel算子为

y方向的Sobel算子为

python代码只需要将上面代码中的Prewitt算子改成Sobel算子即可。

#x方向的Sobel算子

suanzi_x = np.array([[-1, 0, 1],

[-2, 0, 2],

[-1, 0, 1]])#y方向的Sobel算子

suanzi_y = np.array([[-1,-2,-1],

[ 0, 0, 0],

[1, 2, 1]])

Sobel算子的结果如下图所示

上方:左图为原图像,右图为x方向导数图像

下方:左图为y方向导数图像,右图为梯度图像

从图中看出,比较Prewitt算子和Sobel算子,Sobel算子稍微减少了一点噪声,但噪声还是比较多的。

未完,待续

参考列表

1.《python计算机视觉编程》

原文:http://www.cnblogs.com/smallpi/p/4555854.html

python图像边缘检测报告_python计算机视觉2:图像边缘检测相关推荐

  1. python图像融合算法_Python OpenCV 实现图像融合

    原标题:Python OpenCV 实现图像融合 来自:https://www.linuxmi.com/python-opencv-image-blending.html 在本文中,我们将讨论Pyth ...

  2. python如何移动图片_python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住...

    仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...

  3. python 怎么得到图像深度图 软件_python有关于图像的深度和通道

    目录: (一)图像的深度和图像的通道 (1)图像的深度 (2)图像的通道 (二)自定义一张多通道的图片 (1)zeros 函数 (2)ones 函数 (三)自定义一张单通道的图片 (四)像素操作 (1 ...

  4. python综合实验报告_Python程序设计实验报告五:综合运用三种基本结构进行程序设计(综合性实验)...

    安徽工程大学 Python程序设计 实验报告 班级 物流191 姓名姚彩琴学号3190505129 成绩 日期 2020.4.22 指导老师修宇 [实验名称]综合运用三种基本结构进行程序设计(综合性实 ...

  5. python上机编程报告_Python程序设计实验报告六:函数

    安徽工程大学 Python程序设计 实验报告 班级:物流191 姓名:徐丹丹 学号:3190505132 成绩: 日期:2020年5月4日 指导老师:修宇 [实验目的] 掌握函数的定义与使用方法:掌握 ...

  6. python综合实验报告_Python程序设计 实验报告

    安徽工程大学 Python程序设计 实验报告 班级:物流192       姓名:刘马汉卿学号:319005211 成绩:            日期:2020年4月29日        指导老师:修 ...

  7. python程序项目报告_python程序设计实验报告

    安徽理工大学Python编程实验报告类物流192名陆代学生号码3190505207年级日期教师秀于实验名称实验一个熟悉闲置和在线编程平台实验目的1.掌握python闲置的安装和使用集成开发环境2.熟悉 ...

  8. python图像边缘检测报告_python – 检测图像的最外边缘并基于它进行绘图

    我会使用以下方法尝试找到问题中提供的四行. 1.读取图像,并将其转换为灰度 import cv2 import numpy as np rgb_img = cv2.imread('pipe.jpg') ...

  9. python opencv 读取图片_Python opencv 读取图像

    对于 matlab 起家做数字图像处理的人来讲都非常适应matlab对图像处理的操作和思路,尤其是它可以非常方便直观的看到图像的RGB值. 由于最近在研究深度学习的计算机视觉方面的东西,于是完全自学接 ...

  10. python 视频 灰度 伽玛_Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换...

    作者 | 杨秀璋 来源 | CSDN博客 责编 | 夕颜 头图 | 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包 ...

最新文章

  1. spring cloud连载第二篇之Spring Cloud Config
  2. R语言将多个dataframe数据添加在列表(list)结构中并进行列表dataframe的索引:包含dataframe的列表、包含dataframe的列表的索引
  3. oracle10g- emctl start dbconsole 启动问题
  4. 基因分子生物学(1)-基因常识与DNA常识
  5. 云原生架构下的持续交付实践
  6. android获取程序名称,Android获取应用程序名称(ApplicationName)示例
  7. Java实现蛇形矩阵
  8. 【工具分享】推荐一款超级好用的截图工具
  9. 创建AWS VPC Peering
  10. 16代表啥_16代表的爱情恋爱含义16代表什么爱情含义
  11. div+css入门知识
  12. c++builder:Project Project1.exe raised exception class EAccessViolation with message 'Access violati
  13. 自学Vue之路——Vue介绍及基本语法
  14. 【论文笔记】多任务学习(Multi-Task Learning)
  15. 电脑双屏显示变单屏后部分程序无法在当前屏幕显示的问题
  16. QQ音乐7.0换新上线: 轻简风带来全新听歌体验
  17. 数云荣登乌镇互联网大会2016中国大数据创新企业50强
  18. 龙格现象 图像对比及Python代码实现
  19. 【SVN迁移】SVN迁移服务器代码,包含全部提交日志
  20. windows中新建任何后缀的文件(包括无后缀名)

热门文章

  1. JPA的常用操作和配置总结
  2. Python中的*args和**kwargs的理解与用法
  3. ActiveMQ(19):高级特性之独有消费者(Exclusive Consumer)
  4. indexOf 和 lastIndexOf 使用
  5. [leetcode] Sudoku Solver
  6. 软件测试 -- 单元测试,集成测试,系统测试的侧重点
  7. c位边上还有什么位_火箭少女海报一反常态,孟美岐取代yamy站C位,吴宣仪在边上...
  8. gc日志怎么看_JVM探秘:GC日志收集与分析
  9. linux服务器关闭web,linux关闭防火墙后还访问不了Web?已解决,关闭防火墙及清除防火墙策略...
  10. python怎么恢复默认窗口_如何恢复python编程环境spyder的窗口?