图像处理--边缘检测
边缘检测原理
边缘检测(Edge Detection)是图像处理和计算机视觉中的基本问题,其目的在于标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。边缘的表现形式如下图所示:
图像边缘检测大幅度地减少了数据量,并且剔除了可看作不相关的信息,保留了图像重要的结构属性。边缘检测的方法可大致划分为两类:
1)基于搜索:通过寻找图像一阶导数中的最大值和最小值来检测边界,通常是将边界定位在梯度最大的方向,代表算法是Sobel算子和Scharr算子。
2)基于零穿越:通过寻找图像二阶导数零穿越来寻找边界,通常是Laplacian过零点或者非线性差分表示的过零点,代表算法是Laplacian算子。
Canny边缘检测算法
Canny边缘检测算法是一种非常流行的边缘检测算法,是JohnF.Canny于1986年提出的,被认为是最优的边缘检测算法。它可分为4个步骤:去除噪声、计算图像梯度、非极大值抑制和滞后阈值。
去除噪声
边缘检测极易受到噪声影响,因此需要使用高斯滤波器去除噪声。
计算图像梯度幅值与方向
在数学中,梯度的本意是一个向量,表示函数在某点的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快,变化率最大。
图像中用梯度表示灰度值的变化程度与方向,而边缘就是指灰度强度变化最强的位置。梯度方向与边缘方向呈垂直关系。
此处采用Sobel滤波器计算梯度的大小和方向。Sobel算子GX是水平方向的一阶导数,用于检测Y轴方向的边缘,而GY则是竖直方向的一阶导数,用于检测X轴方向的边缘。
非极大值抑制
非极大值抑制(Non-MaximumSuppression,NMS),即保留局部最大值,
抑制非局部最大值的所有值。简单而言,就是对图像的所有像素点进行检测,如果某点的梯度强度大于其梯度方向的正负方向的像素点,则该点保留;否则,该点被抑制。
Canny边缘检测算法是沿着梯度方向对幅值进行非极大值抑制的,而非边缘方向。
滞后阈值
为了确定真正的边界,需要设定两个阈值“minVal”和“maxVal”。当图像某点的灰度梯度大于阈值“maxVal”,该点被视为真的边界点;当某点的灰度梯度小于阈值“minVal”,则该点不看作边界点;当某点的灰度梯度介于两个阈值之间,根据该点是否与真的边界点相连来进行判断,相连则将该点也看作边界点,否则将其抛弃。
代码
import cv2
import numpy as np
import matplotlib.pyplot as plt#图像读取
img = cv2.imread("test.jpg")#Canny边缘检测
lowThreshold = 1 #最小阈值
max_lowThershold = 80 #最大阈值
canny = cv2.Canny(img, lowThreshold, max_lowThreshold)#图像展示
plt.figure(figsize = (8, 5), dpi = 100)
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(121), plt.imshow(img, camp=plt.cm.grap). plt.title("Original")
plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(canny, cmap = plt.cm.gray), plt.title("Edge Detection")
plt.xticks([]), plt.yticks([])
plt.show()
图像展示代码有不懂的地方,可以参考这篇文章:
图像处理–平滑
图像处理--边缘检测相关推荐
- 数字图像处理:边缘检测(Edge detection)
转载自:https://zhuanlan.zhihu.com/p/59640437 觉得写得通俗易懂,要是每个人的博客都这么人性化.... 写在前面: 本文篇幅较长,用了大量图与公式帮助大家深入理解各 ...
- OpenCV图像处理——边缘检测
总目录 图像处理总目录←点击这里 八.边缘检测 Canny边缘检测 使用高斯滤波器,以平滑图像,滤除噪声. 计算图像中每个像素点的梯度强度和方向. 应用非极大值(Non-Maximum Suppres ...
- java 图像梯度检测_数字图像处理-边缘检测
梯度介绍 首先介绍边缘检测中用到的高等数学原理---梯度.介绍梯度,离不开方向导数. 方向导数 顾名思义,方向导数就是某个方向上的导数. 什么是方向: 函数 在这个方向上的图像: 我们知道: 函数 的 ...
- php 图像边缘检测,科学网—图像处理边缘检测 - 李敏的博文
一:梯度,边缘和角点 物体的边缘以局部特征不连续性出现,也就是图像局部亮度变化最显著的部分,如,灰度,颜色,纹理结构的突变.物体边缘是区分不同区域的分界处.图像边缘特性:方向和幅度.沿边缘走向的像素灰 ...
- 图像处理——边缘检测
边缘检测 一.边缘检测的目的 二.边缘检测算子有哪些? 三.Canny算子 3.1.简述Canny算子 3.2.简述下Canny的计算过程 四.sobel算子 4.1 简述一下sobel算子 五.深度 ...
- 图像处理+边缘检测算法
一.边缘检测算子类别 常见边缘检测算子:Roberts .Sobel .Prewitt.Laplacian.Log/Marr.Canny.Kirsch.Nevitia 二.一阶微分算子:Roberts ...
- 数字图像处理---边缘检测算法复现(ED、EDPF、CannySR、CannySRPF)
目录 前言 (一)无法查找或打开 PDB 文件. (二)自带的测试图像完美运行,自己的图片运行报错 前言 本篇主要记录一下在进行四种边缘检测算法(ED.EDPF.CannySR.CannySRPF)复 ...
- 【Matlab 图像】边缘检测算法及效果演示
[Matlab 图像]边缘检测算法及效果演示 边缘检测 检测图像中的边缘 Matlab 代码 代码效果如下 边缘算法:robert 边缘算法:sobel prewitt 边缘算法:laplacian ...
- Matlab 图像处理的一些杂记
图像直方图均衡- - Tag: matlab 图像处理 直方图均衡 % 数字图像处理程序作业 % 本程序能将JPG格式的彩色图像文件灰度化并进行直方图均衡 % % 输入文件:Pic ...
最新文章
- Mybatis学习记录-使用问题总结之一DISTINCT
- 图片像素、英寸、厘米之间的单位换算
- SpringCloud-创建服务消费者-Ribbon方式(附代码下载)
- BZOJ-1406-密码箱-AHOI2007-数学
- 农历鸡年(丁酉)正月初一第一博
- Servlet的快速入门以及执行原理
- 3. HTML中的容器标签
- Linux ARM交叉编译工具链制作过程
- 一次MySQL死锁问题解决
- 万达影视发布声明:不存在所谓的从《流浪地球》撤资
- python批量读取图片并批量保存_Python实现批量读取图片并存入mongodb数据库的方法示例...
- javaSE学习 访问控制
- Mvc 4.0实现Response.Write()效果
- 使用Zookeeper实现负载均衡原理
- 闲来无事实现个备忘录,到点提醒
- java程序如何提取数据库json格式_java解析json格式文件,再保存在数据库怎么做?...
- 转:visio 2013 激活软件 -- 记录
- Excel如何批量设置英语句首大写
- [BZOJ3993]-[SDOI2015]星际战争-二分答案+最大流
- Excel模板导出并插入图片