1. cv2.Canny(src, thresh1, thresh2) 进行canny边缘检测

参数说明: src表示输入的图片, thresh1表示最小阈值,thresh2表示最大阈值,用于进一步删选边缘信息

Canny边缘检测步骤:

第一步:使用高斯滤波器进行滤波,去除噪音点

第二步:使用sobel算子,计算出每个点的梯度大小和梯度方向

第三步:使用非极大值抑制(只有最大的保留),消除边缘检测带来的杂散效应

第四步:应用双阈值,来确定真实和潜在的边缘

第五步:通过抑制弱边缘来完成最终的边缘检测

第一步:高斯滤波进行滤波操作

这是3*3的归一化后的高斯核,将当前核与图片中的9个位置对应位置求和,表示当前位置的像素值,进行平滑处理,去除一些噪声点的干扰

第二步:使用sobel算子,计算各个点的梯度大小和梯度方向

使用的sobel算子存在两个方向,即x轴和y轴方向,分别计算x轴的梯度为Gx, 计算y轴的梯度为Gy

当前点的梯度大小 = sqrt(Gx ^ 2 + Gy ^ 2)

梯度的方向:Θ = arctan(Gx / Gy)

第三步:使用非极大值抑制,消除杂散效应

非极大值抑制第一种方式,如图所示,g1表示的是坐上角一点的梯度值,g2为当前点上面一点的梯度值,斜线表示的是梯度的方向,我们需要计算出斜线与g1,g2交点的近似梯度值,使用线性差值表示:即M(dtmp1) = w*M(g2) + (1-w) * M(g1)  w = distance(dtmp1, g2) / distance(g1, g2)

同理计算出M(dtmp2) 即斜线与g3,g4的交点的近似梯度值

将C点的梯度值与M(dtmp1) 和 M(dtmp2)的大小做一个比较,如果比两者都大就保留,否者就去除

非极大值抑制第二种方式,如图所示, 我们可以直接比较梯度方向的斜线与哪条直线比较接近,就与哪个方向上的梯度值进行比较,我们可以初步的知道角度的区间是

(30, 45, 60, 90) , 举例说明,如果斜线靠近45度角的斜线,那么就与对角线上的两个点的梯度做比较,如果都大于则保留,否者剔除

第四步:使用双阈值来获得真实边缘和潜在的边缘

进行进一步删选,如果当前梯度值大于给定的maxVal,判断为边界, 如果当前梯度值小于minval则舍弃,如果当前梯度值在给定的最大值和最小值之间,如果其周围的点是边界点,那么当前点保留,否者舍弃

从上图我们可以看出,当minval和maxval越小时,所保留的边缘信息更多

第一步:载入lena图片

第二步:使用两组阈值,对结果作图做比较

第三步:载入汽车的图

第四步: 使用两组阈值,对结果作图做比较

import cv2
import numpy as np img = cv2.imread('lena.jpg')
v1 = cv2.Canny(img, 80, 150)
v2 = cv2.Canny(img, 50, 100) ret = np.hstack((v1, v2))
cv2.imshow('img', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

在最大阈值和最小阈值都偏小的情况下,我们可以看出右边这幅图比左边这幅图拥有更多的轮廓信息,同样的也容易存在一些非边缘点的信息

car = cv2.imread('car.png')
v1 = cv2.Canny(car, 120, 250)
v2 = cv2.Canny(car, 50, 100)
ret = np.hstack((v1, v2))
cv2.imshow('car', ret)
cv2.waitKey(0)
cv2.destroyAllWindows()

右边的图的边缘信息更多,左边的图很多房子的线条没有了

机器学习进阶-边缘检测-Canny边缘检测 1.cv2.Canny(进行Canny边缘检测)的更多相关文章

  1. 机器学习进阶-图像基本操作-数值计算 1.cv2.add(将图片进行加和) 2.cv2.resize(图片的维度变换) 3.cv2.addWeighted(将图片按照公式进行重叠操作)

    1.cv2.add(dog_img, cat_img)  # 进行图片的加和 参数说明: cv2.add将两个图片进行加和,大于255的使用255计数 2.cv2.resize(img, (500, ...

  2. 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)

    1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...

  3. 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 1.cv2.cvtColor(图像颜色转换) 2.cv2.findContours(找出图像的轮廓) 3.cv2.drawContours(画出图像轮廓) 4.cv2.contourArea(轮廓面积) 5.cv2.arcLength(轮廓周长) 6.cv2.aprroxPloyDP(获得轮廓近似) 7.cv2.boudingrect(外接圆)..

    1. cv2.cvtcolor(img, cv2.COLOR_BGR2GRAY) # 将彩色图转换为灰度图 参数说明: img表示输入的图片, cv2.COLOR_BGR2GRAY表示颜色的变换形式 ...

  4. 机器学习进阶-人脸关键点检测 1.dlib.get_frontal_face_detector(构建人脸框位置检测器) 2.dlib.shape_predictor(绘制人脸关键点检测器) 3.cv2.convexHull(获得凸包位置信息)

    1.dlib.get_frontal_face_detector()  # 获得人脸框位置的检测器, detector(gray, 1) gray表示灰度图, 2.dlib.shape_predict ...

  5. 机器学习进阶-目标追踪-SSD多进程执行 1.cv2.dnn.readnetFromCaffe(用于读取已经训练好的caffe模型) 2.delib.correlation_tracker(生成追踪器) 5.cv2.writer(将图片写入视频中) 6.cv2.dnn.blobFromImage(图片归一化) 10.multiprocessing.process(生成进程)

    1. cv2.dnn.readNetFromCaffe(prototxt, model)  用于进行SSD网络的caffe框架的加载 参数说明:prototxt表示caffe网络的结构文本,model ...

  6. 机器学习进阶-目标跟踪-KCF目标跟踪方法 1.cv2.multiTracker_create(构造选框集合) 2. cv2.TrackerKCF_create(获得KCF追踪器) 3. cv2.resize(变化图像大小) 4.cv2.selectROI(在图像上框出选框)

    1. tracker = cv2.multiTracker_create() 获得追踪的初始化结果 2.cv2.TrackerKCF_create() 获得KCF追踪器 3.cv2.resize(fr ...

  7. 机器学习进阶-光流估计 1.cv2.goodFeaturesToTrack(找出光流估计所需要的角点) 2.cv2.calcOpticalFlowPyrLK(获得光流检测后的角点位置) 3.cv2.add(进行像素点的加和)

    1.cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params)  用于获得光流估计所需要的角点参数说明:old_gray表示输入图片, ...

  8. 机器学习进阶-背景建模-(帧差法与混合高斯模型) 1.cv2.VideoCapture(进行视频读取) 2.cv2.getStructureElement(构造形态学的卷积) 3.cv2.createBackgroundSubtractorMOG2(构造高斯混合模型) 4.cv2.morpholyEx(对图像进行形态学的变化)

    1. cv2.VideoCapture('test.avi') 进行视频读取 参数说明:‘test.avi’ 输入视频的地址2. cv2.getStructureElement(cv2.MORPH_E ...

  9. 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(RANSCA) 1.sift.detectAndComputer(获得sift图像关键点) 2.cv2.findHomography(计算单应性矩阵H) 3.cv2.warpPerspective(获得单应性变化后的图像) 4.cv2.line(对关键点位置进行连线画图)

    1. sift.detectAndComputer(gray, None)  # 计算出图像的关键点和sift特征向量 参数说明:gray表示输入的图片 2.cv2.findHomography(kp ...

随机推荐

  1. CentOS7安装配置PostgreSQL9.6

    本文涉及CentOS7下PostgreSQL9.6的yum安装,访问配置及简单使用. 一.验证环境 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. Postgre ...

  2. Spring @Async使用方法总结

    引言: 在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3. ...

  3. 学习笔记之Swagger

    World's Most Popular API Framework | Swagger https://swagger.io/ Swagger is the world’s largest fram ...

  4. 简单的单进程FTP服务器的实现

    一.功能说明: 1.本程序基于socket实现客户端与服务器端的单进程交互 2.用到的用户名:whw,密码abc123——服务器端密码的验证利用hashlib模块进行MD5的编码以确保通信安全. 3. ...

  5. UE4中多种颜色轮廓线的后期处理

    转自:http://blog.csdn.net/pizi0475/article/details/50396277 随着近来虚幻引擎4的一些变化,渲染多种颜色的轮廓线已经可以实现了!通过自定义模板,类 ...

  6. postgresql定位分析消耗CPU高的SQL语句

    第一步:使用TOP命令查看占用CPU高的postgresql进程,并获取该进程的ID号,如图该id号为3640 第二步:切换到postgres用户,并且psql连接到数据库,执行如下查询语句 SELE ...

  7. MySQL MHA 搭建&测试(环境:CentOS7 + MySQL5.7.23)

    MySQL MHA架构介绍: MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Face ...

  8. 【 MAKEFILE 编程基础之四】详解MAKEFILE 函数的语法与使用!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/771.html   ...

  9. CRM 2016 刷新 Iframe

    在CRM中刷新IFame: /// <summary>刷新Iframe的内容,用于表单上刷新iframe里的内容</summary> var iframe = Xrm.Page ...

  10. sublime 格式化react插件配置教程 jsfmt配置

    1.下载如下插件: https://github.com/ionutvmi/sublime-jsfmt#installation 这个插件是jsfmt,可以直接在package里搜索到: 2.user ...