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. 《Java并发编程实战》笔记-OneValueCache与原子引用技术

    /** * NumberRange * <p/> * Number range class that does not sufficiently protect its invariant ...

  2. PAT 乙级 1079 延迟的回文数(20 分)

    1079 延迟的回文数(20 分) 给定一个 k+1 位的正整数 N,写成 a​k​​⋯a​1​​a​0​​ 的形式,其中对所有 i 有 0≤a​i​​<10 且 a​k​​>0.N 被称 ...

  3. hadoop长时间运行后,stop-all.sh报错

    报错现象: hadoop在stop-all.sh的时候依据的是datanode上的mapred和dfs进程号. 而默认的进程号保存在/tmp下,linux默认会每 隔一段时间(一般是一个月或者7天左右 ...

  4. spring笔记-@Primary注解

    1.问题 当一个接口有2个不同实现时,使用@Autowired注解时会报org.springframework.beans.factory.NoUniqueBeanDefinitionExceptio ...

  5. Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集

    ylbtech-Java-Runoob-高级教程-实例-数组:12. Java 实例 – 数组差集 1.返回顶部 1. Java 实例 - 数组差集  Java 实例 以下实例演示了如何使用 remo ...

  6. 3d图像坐标轴及css3属性的讲解

    3d立体坐标轴 如有不知道各种插件的怎么办? 网上查,百度 1.css选择器: 1.id 2.class 3.标签 4.子代 5.后代 6.交集 7.并级 8.通配符 9.结构 10.伪类 11.属性 ...

  7. PowerDesigner最基础的使用方法入门学习(一)

    1:入门级使用PowerDesigner软件创建数据库(直接上图怎么创建,其他的概念知识可自行学习) 我的PowerDesigner版本是16.5的,如若版本不一样,请自行参考学习即可.(打开软件即是 ...

  8. python输出缓冲区的问题

    碰到的问题,一段代码,print在前,log的在后,查看日志中log的反而在前面.是python输出缓冲区的问题. python输出缓冲区要满 4k 才写入文件,除非禁用缓存或者强制输出或者程序结束. ...

  9. 1124 Raffle for Weibo Followers (20 分)

    1124 Raffle for Weibo Followers (20 分) John got a full mark on PAT. He was so happy that he decided ...

  10. 如何查看yum 安装的软件路径

    1.首先安装一个redis [root@iZbp1eem925ojwyx17ao9kZ ~]# yum install redis 2.查找redis的安装包 [root@iZbp1eem925ojw ...