OpenCv之Canny边界检测(笔记13)
#Canny边缘检测
canny边缘检测是一种非常流行的边缘检测算法,是John.F.Canny再1986年提出来了的。他是一个很多步构成的算法,我们接下来逐步介绍。
1、噪声去除 由于边缘检测很容易受到噪声的影响,所以第一步是使用5x5的高斯滤波器去除噪声
2、计算图像梯度 对平滑后的图像使用Sobel算子计算水平方向的和竖直方向的一阶导数(图像梯度)(Gx和Gy)。根据得到的这俩福梯度图(Gx和Gy)找到边界的梯度和方向, 公式如下:
梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直,水平,和俩个对角线。
3、非极大值抑制 再获得梯度的方向和大笑之后,应该对整幅图像做一个扫描,去除那些非边界上的点。对每一个像素进行检查,看这个点的梯度是不是周围具有相同的梯度方向的点 中最大的。如下所示: 上图当中的数字代表了像素点的梯度强度,箭头方向代表了梯度的方向。以第二排第三个像素点为例,由于梯度方向向上,则将这一点的强度(7)与其上下俩个像素点的强度 (5和4)比较,由于这一点强度最大,则保留。
4、滞后阈值 现在要确定那些边界才是真正的边界。这时我们需要设置俩个阈值:minVal和maxVal。当图像的灰度梯度高于maxVal时被认为是真的边界,那些低于minVal的边界会被抛弃 。如果介于俩者之间的话,就要看这个点是否与某个被确认为真正的边界点相连,如果是就认为它是边界点,如果不是就抛弃。如下图: A高于阈值maxVal所以是真正的边界点,B虽然低于maxVal但高于minVal并且与A相连,所以也被认为是真正的边界点。而C就会被抛弃,因为他不仅低于maxVal而 且不与真正的边界相连。D也会被抛弃,因为低于minVal。所以选择合适的maxVal和minVal对于能否得到好的结果非常重要。在这一步一些小的噪声点也会被除去,因为我们假设边界都是一些 长的线段。
Canny使用 再Opencv中只需要一个激活函数:cv2.Canny(),就可以完成以上几步。让我们看如何使用这个函数。这个函数的第一参数是输入图像。第二和第三个分别是 minVal和maxVal。第四个参数设置用来计算图像梯度的Sobel卷积核的大小,默认值为3.最后一个参数是L2gradient,它可以用来设定求梯度大小方程式。 如果设为True,就会使用我们饿上面提到过的方程:否则使用方程:,默认值是False。
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
# image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)def edge_detection(image,minVal=100,maxVal=200):image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)edges=cv2.Canny(image,minVal,maxVal)plt.imshow(edges,'gray')plt.axis('off')plt.show()edge_detection(image)
效果展示:
注意设定边界的阈值的最大值和最小值,对结果影响还是特别大
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)image = cv2.GaussianBlur(image,(3,3),0)
Value=[(10,150),(100,200),(180,230)]
plt.figure(figsize=(20,5))
for i,(minVal,maxVal) in enumerate(Value):plt.subplot(1,3,i+1)edges=cv2.Canny(image,minVal,maxVal)edges=cv2.GaussianBlur(edges,(3,3),0)plt.imshow(edges,'gray')plt.title(str((minVal,maxVal)))plt.axis('off')
plt.show()
效果展示:
不知道如何选取阈值:
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像边缘检测
def show(image):plt.imshow(image)plt.axis('off')plt.show()def imread(image):image=cv2.imread(image)#把图像的BGR转换成RGBimage=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)return image
image=imread('im.jpg')
# show(image)
image=cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)#不知道阈值应该如何选取
def auto_canny(image,sigma=0.33):v=np.median(image)lower=int(max(0,(1.0-sigma)*v))upper=int(min(255,(1.0+sigma)*v))edged=cv2.Canny(image,lower,upper)print(lower,upper)return edgededges=auto_canny(image)
edges=cv2.GaussianBlur(edges,(3,3),0)
plt.imshow(edges,'gray')
plt.axis('off')
plt.show()
效果展示:
OpenCv之Canny边界检测(笔记13)相关推荐
- opencv进阶学习笔记13:图像形态学操作大全(膨胀,腐蚀,开闭,黑帽,顶帽,梯度)python版
基础版学习笔记: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 基础版形态学: opencv学 ...
- [深度学习]Part1 Python学习进阶Ch24图像处理OpenCV(24.1~24.13)——【DeepBlue学习笔记】
本文仅供学习使用 Python高级--Ch24图像处理OpenCV(24.1~24.13) 24. 图像处理OpenCV 24.1 图像读取.显示.保存 24.1.1 图像的基本操作 24.1.2 摄 ...
- opencv+Recorder︱OpenCV 中的 Canny 边界检测+轮廓、拉普拉斯变换
本文来自于段力辉 译<OpenCV-Python 中文教程> 边缘检测是图像处理和计算机视觉中的基本问题,通过标识数字图像中亮度变化明显的点,来捕捉图像属性中的显著变化,包括深度上的不连续 ...
- OpenCV之Python学习笔记
RSS订阅 登陆 注册 原文链接地址:http://www.itozi.net/19477.html OpenCV之Python学习笔记 ITOZI 发布于 2015-08-06 分类:OpenSta ...
- OpenCV之Python学习笔记(1)(2): 图像的载入、显示和保存 图像元素的访问、通道分离与合并
OpenCV之Python学习笔记 一直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看到一本国外的新书< ...
- 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录
基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...
- 12月19日 OpenCV 实战基础学习笔记——特征匹配
文章目录 前言 一.特征匹配 1.Brute-force 蛮力匹配 2.1 对 1 匹配 3.k 对最佳匹配 二.答题卡识别 前言 本文为12月19日 OpenCV 实战基础学习笔记--特征匹配,分为 ...
- Python,Opencv cv2.Canny()边缘检测
Python,Opencv的Canny边缘检测 1. 效果图 2. 源码 参考 这篇博客将介绍Canny边缘检测的概念,并利用cv2.Canny()实现边缘检测: Canny边缘检测是一种流行的边缘检 ...
- OpenCV for Ios 学习笔记(4)-标记检测1
本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...
最新文章
- 分布式存储(ceph)技能图谱(持续更新)
- 盘点2013年那些最优秀的网页设计作品【系列五】
- Uninstall Office 2016 for Mac
- java中多态_Java中多态的理解
- java 金字塔样式输出_Java打印金字塔(正实心、正空心,倒实心、倒空心),菱形...
- OpenShift 4 之集群是如何通过Cluster Version Operator升级的?
- 不会框架不要紧,我带你自定义框架
- C语言复习---获取矩阵的对角和
- 《暮色4:破晓(上)》暮光之城 高清蓝光BD 1080P 720P下载,附中英双字字幕!...
- java自动发图文微博_自动发带图的微博
- Jenkins构建maven项目失败
- 一篇运维老司机的大数据平台监控宝典(1)-联通大数据集群平台监控体系进程详解
- 深度相机原理揭秘之3D结构光Sensor(iPhone X、小米8探索版、OPPO Find)
- C语言十个数中求出平均值
- Navicat连接mysql时提示error:1130 hostxxx is not allowed to connect to this SQL server
- 后端-数据字典模块开发
- DNS劫持原理与操作
- CSS渐变字体、镂空字体、input框提示信息颜色、给图片加上内阴影、3/4圆
- C语言中的内部函数与外部函数
- Clair:CoreOS发布的开源容器漏洞分析工具
热门文章
- [jQuery] 通过ajax保存到服务器,成功显示信息.
- LA 4254 贪心
- 存储类、链接、内存管理
- 《DSP using MATLAB》示例Example4.6
- dynamic 找不到编译动态表达式所需的一种或多种类型。是否缺少引用?
- JavaScript中DOM的层次节点(一)
- Teamcity+SVN+VisualStudio在持续集成简明教程
- css 相对单位rem详解
- Struts2是什么?
- broadcast receiver 接收设备重启意图( boot_completed Broadcast Intent)而重启定时器