10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子
10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子
文章目录
- 10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子
- 1 算法原理
- 1.1 Sobel 算子
- 1.2 Roberts 算子
- 1.3 拉普拉斯(Laplacian) 算子
- 1.4 Canny 算法
- 1.5 Prewitt 算子
- 1.6 高斯拉普拉斯算子(LOG 算子)
- 2 代码
- 3 效果
1 算法原理
图像边缘是图像最基本的特征,所谓边缘(Edge) 是指图像局部特性的不连续性。灰度或结构等信息的突变处称之为边缘。例如,灰度级的突变、颜色的突变,、纹理结构的突变等。边缘是一个区域的结束,也是另一个区域的开始,利用该特征可以分割图像。图像的边缘有方向和幅度两种属性。边缘通常可以通过一阶导数或二阶导数检测得到。一阶导数是以最大值作为对应的边缘的位置,而二阶导数则以过零点作为对应边缘的位置。
边缘检测算子分类:
一阶导数的边缘算子
通过模板作为核与图像的每个像素点做卷积和运算,然后选取合适的阈值来提取图像的边缘。常见的有 Roberts 算子、Sobel 算子和 Prewitt 算子。
二阶导数的边缘算子依据于二阶导数过零点,常见的有 Laplacian 算子,此类算子对噪声敏感。
其他边缘算子
前面两类均是通过微分算子来检测图像边缘,还有一种就是 Canny 算子,其是在满足一定约束条件下推导出来的边缘检测最优化算子。
1.1 Sobel 算子
Sobel 算子是一种用于边缘检测的离散微分算子,它结合了高斯平滑和微分求导。该算子用于计算图像明暗程度近似值,根据图像边缘旁边明暗程度把该区域内超过某个数的特定点记为边缘。Sobel 算子在 Prewitt 算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,距离越近的像素点对应当前像素的影响越大,从而实现图像锐化并突出边缘轮廓。
Sobel 算子根据像素点上下、左右邻点灰度加权差,在边缘处达到极值这一现象检测边缘。对噪声具有平滑作用,提供较为精确的边缘方向信息。因为 Sobel 算子结合了高斯平滑和微分求导(分化),因此结果会具有更多的抗噪性,当对精度要求不是很高时,Sobel 算子是一种较为常用的边缘检测方法。
Sobel 算子的边缘定位更准确,常用于噪声较多、灰度渐变的图像。其算法模板如下面的公式所示,其中 dx 表示水平方向,dy 表示垂直方向。
1.2 Roberts 算子
Roberts 算子又称为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。常用来处理具有陡峭的低噪声图像,当图像边缘接近于正 45 度或负 45 度时,该算法处理效果更理想。其缺点是对边缘的定位不太准确,提取的边缘线条较粗。Roberts 算子的模板分为水平方向和垂直方向,如下式所示,从其模板可以看出,Roberts 算子能较好的增强正负 45 度的图像边缘。
在 Python 中,Roberts 算子主要通过 numpy 定义模板,再调用 OpenCV 的 filter2D() 函数实现边缘提取。该函数主要是利用内核实现对图像的卷积运算。
1.3 拉普拉斯(Laplacian) 算子
拉普拉斯(Laplacian) 算子是 n 维欧几里德空间中的一个二阶微分算子,常用于图像增强领域和边缘提取。它通过灰度差分计算邻域内的像素。算法基本流程为:
判断图像中心像素灰度值与它周围其他像素的灰度值,如果中心像素的灰度更高,则提升中心像素的灰度;反之降低中心像素的灰度,从而实现图像锐化操作;
在算法实现过程中,Laplacian 算子通过对邻域中心像素的四方向或八方向求梯度,再将梯度相加起来判断中心像素灰度与邻域内其他像素灰度的关系;
最后通过梯度运算的结果对像素灰度进行调整。
1.4 Canny 算法
Canny 算法是一种被广泛应用于边缘检测的标准算法,其目标是找到一个最优的边缘检测解或找寻一幅图像中灰度强度变化最强的位置。最优边缘检测主要通过低错误率、高定位性和最小响应三个标准进行评价。Canny 算子的简要步骤如下:
去噪声:应用高斯滤波来平滑图像,目的是去除噪声;
梯度:找寻图像的梯度;
非极大值抑制:应用非最大抑制技术来过滤掉非边缘像素,将模糊的边界变得清晰。该过程保留了每个像素点上梯度强度的极大值,过滤掉其他的值;
应用双阈值的方法来决定可能的(潜在的)边界;
利用滞后技术来跟踪边界。若某一像素位置和强边界相连的弱边界认为是边界,其他的弱边界则被删除。
1.5 Prewitt 算子
Prewitt 算子是一种图像边缘检测的微分算子,其原理是利用特定区域内像素灰度值产生的差分实现边缘检测。由于 Prewitt 算子采用 33 模板对区域内的像素值进行计算,而 Robert 算子的模板为 22,故 Prewitt 算子的边缘检测结果在水平方向和垂直方向均比 Robert 算子更加明显。Prewitt 算子适合用来识别噪声较多、灰度渐变的图像,其计算公式如下所示:
在 Python 中,Prewitt 算子的实现过程与 Roberts 算子比较相似。通过 Numpy定义模板,再调用 OpenCV 的 filter2D() 函数实现对图像的卷积运算,最终通过 convertScaleAbs() 和 addWeighted() 函数实现边缘提取。
1.6 高斯拉普拉斯算子(LOG 算子)
高斯拉普拉斯算子(LOG 算子):是高斯和拉普拉斯的双结合,即集平滑和边沿于一身的算子模型。LoG 算子是由拉普拉斯算子改进而来。拉普拉斯算子是一个单纯的二阶导数算子,是一个标量,具有线性、位移不变性,其传函在频域空间的原点为 0。所有经过拉普拉斯算子滤波的图像具有零平均灰度。但是该算子的缺点是 对噪声具有无法接受的敏感性,因此在实际应用中,一般先要对图像进行平滑滤波,再用拉氏算子进行图像的边缘检测。这就是 LOG 算子的产生的背景(最后的梯度表达式为 高斯函数和原图像卷积,再去二阶微分算子)。以 0 为中心,高斯标准差为 σ 的二维的 LOG 函数的表达式如下所示:
2 代码
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉代码依赖包:
matplotlib 3.4.2 numpy 1.20.3 opencv-python 4.1.2.30
# pip安装 pip install matplotlib numpy opencv-python
import cv2
import numpy as np
import matplotlib.pyplot as pltdef put(path):# 读取图像img = cv2.imread(path)b, g, r = cv2.split(img)img2 = cv2.merge([r, g, b])# 灰度化处理图像grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 高斯滤波gaussianBlur = cv2.GaussianBlur(grayImage, (3, 3), 0)# 二值化ret, binary = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)# Sobel算子x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0) # 对x求一阶导y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1) # 对y求一阶导absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# Roberts算子kernelx = np.array([[-1, 0], [0, 1]], dtype=int)kernely = np.array([[0, -1], [1, 0]], dtype=int)x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)# 转uint8absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# 拉普拉斯算子dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)Laplacian = cv2.convertScaleAbs(dst)# 高斯滤波降噪gaussian = cv2.GaussianBlur(grayImage, (5, 5), 0)# Canny算子Canny = cv2.Canny(gaussian, 50, 150)# Prewitt算子kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)# 转uint8absX = cv2.convertScaleAbs(x)absY = cv2.convertScaleAbs(y)Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)# 高斯拉普拉斯算子gaussian = cv2.GaussianBlur(grayImage, (3, 3), 0) # 先通过高斯滤波降噪dst = cv2.Laplacian(gaussian, cv2.CV_16S, ksize=3) # 再通过拉普拉斯算子做边缘检测LOG = cv2.convertScaleAbs(dst)# 用来正常显示中文标签plt.rcParams['font.sans-serif'] = ['SimHei']# 显示图形plt.subplot(241), plt.imshow(img2), plt.title('原始图像'), plt.axis('off')plt.subplot(242), plt.imshow(binary, plt.cm.gray), plt.title('二值图'), plt.axis('off')plt.subplot(243), plt.imshow(Sobel, plt.cm.gray), plt.title('Sobel算子'), plt.axis('off')plt.subplot(244), plt.imshow(Roberts, plt.cm.gray), plt.title('Roberts算子'), plt.axis('off')plt.subplot(245), plt.imshow(Laplacian, plt.cm.gray), plt.title('拉普拉斯算子'), plt.axis('off')plt.subplot(246), plt.imshow(Canny, plt.cm.gray), plt.title('Canny算子'), plt.axis('off')plt.subplot(247), plt.imshow(Prewitt, plt.cm.gray), plt.title('Prewitt算子'), plt.axis('off')plt.subplot(248), plt.imshow(LOG, plt.cm.gray), plt.title('高斯拉普拉斯算子'), plt.axis('off')# plt.savefig('1.new-2.jpg')plt.show()# 图像处理函数,要传入路径
put(r'../image/image3.jpg')
3 效果
10.1 Python图像处理之边缘算子-Sobel算子、Roberts算子、拉普拉斯算子、Canny算子、Prewitt算子、高斯拉普拉斯算子相关推荐
- 干货整理!10个Python图像处理工具,入门必看,提效大法
点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 在图像处理领域,一库在手,相当于天下已有.但是今天给大家推荐10个好用的库,快来看看有 ...
- 干货整理!10个Python图像处理工具,入门必看,提效大法 | 资源
原作:Parul Pandey 铜灵 编译整理 量子位 出品 | 公众号 QbitAI 在图像处理领域,一库在手,相当于天下已有. 最近,有一位搞数据科学的小姐姐Parul Pandey,整理了一份实 ...
- 10个Python图像处理工具,非常全了!
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者:Parul Pandey 编译:ronghuaiyang 导 ...
- 如何用python处理图片_推荐:10个Python图像处理工具
概述了一些常用的Python库,它们提供了一种简单直观的图像转换方法. 介绍 在我们今天的世界中有很多的数据,而图像是这些数据中的重要组成部分.但是,要使用这些图像,需要对它们进行处理.因此,图像处理 ...
- 10个Python图像处理工具
你好,我是悦创. 常见的图像处理任务包括显示. 裁剪.翻转.旋转.图像分割.特征提取等,Python 是这些图像处理任务的绝佳选择,日前,帕洛·潘迪(Parul Pandey )整理了 10 个最常用 ...
- python图像处理的书籍推荐_推荐:10个Python图像处理工具
概述了一些常用的Python库,它们提供了一种简单直观的图像转换方法. 介绍 在我们今天的世界中有很多的数据,而图像是这些数据中的重要组成部分.但是,要使用这些图像,需要对它们进行处理.因此,图像处理 ...
- 图像处理 | 最常用的边缘检测详解与代码(Robert, Sober, Prewitt, Canny, Kirsch, Laplacian, LOG, DOG算子)
边缘检测 一阶 Roberts Cross 罗伯茨交叉算子 Sobel 索贝尔算子 Prewitt 普利维特算子 Canny 算子 Kirsch 算子 二阶 Laplacian 拉普拉斯算子 LoG ...
- python图像锐化 增强边缘_[Python图像处理]十一.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子,Schar算子...
Roberts算子 Roberts算子即为交叉微分算法,它是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条.常用来处理具有陡峭的第噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更 ...
- 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...
- 10个常用的Python图像处理工具,非常全了
图像处理中的常见任务包括显示图像.基本操作(如裁剪.翻转.旋转等).图像分割.分类和特征提取.图像恢复和图像识别.由于Python语言具有很多先进的图像处理工具,而且越来越普及.所以Python成为图 ...
最新文章
- 全国四级网络工程师操作系统部分考纲
- MDSF:在线查看【模型驱动软件工厂】文章汇总
- 计算机基础知识第四章测试,计算机基础知识测试题第四章
- [原创] CSS自定义IOS苹果,Android安卓的CheckBox 效果,可以根据文字大小变化而变化,内框显示文字,另外可自定大小,自定颜色...
- 机房工程施工细节标准做法,每张图都有说明
- DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.7Beta) 增加多语言!
- ssl1597-石子合并问题【区间dp练习】
- Openresty 学习笔记(一)opm 工具的使用
- Python中的join函数
- x86汇编语言(2) 认识8086处理器
- AD画PCB焊盘上出现白圈改网络
- Visio 2016专业版 激活方式
- android最低版本+黑域,免root版黑域
- 绿化版IDEA启动时报IF you already have a 64-bit jdk错误的解决
- RS485转OPC UA
- L1-087 机工士姆斯塔迪奥 和 L1-048 矩阵A乘以B
- VLC接收RTP的H264流串流成OGGT向HTTP发送,可以直接用HTML5播放
- TC118AH单通道内置MOS单通道直流无刷马达驱动IC
- 什么是UPS UPS的选购技巧介绍
- c语言_kbhit函数怎么用,kbhit再c语言中怎么用请教
热门文章
- Java项目开发中实现分页的三种方式一篇包会
- 三部曲打造无路由器破解闪讯WiFi共享 经好几个同学验证
- visio画图小技巧记录
- 牛客Top200---最长回文字符串(java)
- MATLAB矩阵运算部分知识总结
- 亲邻门禁卡复制数据分析
- 【新增esp8266设备订阅命令主题、响应平台命令、命令处理】esp8266接入华为云物联网平台(IOTDA)2.0
- 华为鸿蒙主题设计,3W品牌报:2020 华为全球主题设计大赛获奖作品公布;华为鸿蒙 OS 正式上线...
- c语言笔试面试大全,C语言基础笔试题
- synchronized锁升级之偏向锁