机器学习进阶-边缘检测-Canny边缘检测 1.cv2.Canny(进行Canny边缘检测)
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.cv2.add(将图片进行加和) 2.cv2.resize(图片的维度变换) 3.cv2.addWeighted(将图片按照公式进行重叠操作)
1.cv2.add(dog_img, cat_img) # 进行图片的加和 参数说明: cv2.add将两个图片进行加和,大于255的使用255计数 2.cv2.resize(img, (500, ...
- 机器学习进阶-案例实战-答题卡识别判 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 ...
- 机器学习进阶-图像金字塔与轮廓检测-轮廓检测 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表示颜色的变换形式 ...
- 机器学习进阶-人脸关键点检测 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 ...
- 机器学习进阶-目标追踪-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 ...
- 机器学习进阶-目标跟踪-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 ...
- 机器学习进阶-光流估计 1.cv2.goodFeaturesToTrack(找出光流估计所需要的角点) 2.cv2.calcOpticalFlowPyrLK(获得光流检测后的角点位置) 3.cv2.add(进行像素点的加和)
1.cv2.goodFeaturesToTrack(old_gray, mask=None, **feature_params) 用于获得光流估计所需要的角点参数说明:old_gray表示输入图片, ...
- 机器学习进阶-背景建模-(帧差法与混合高斯模型) 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 ...
- 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(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 ...
随机推荐
- bzoj4941: [Ynoi2016]镜子里的昆虫
维护每个位置x的上一个相等的位置pv[x],可以把询问表示成l<=x<=r,pv[x]<l的形式,对一次修改,均摊改变O(1)个pv的取值,因此可以用平衡树预处理出pv的变化,用cd ...
- 峰Redis学习(1)Redis简介和安装
是从博客:http://blog.java1234.com/blog/articles/310.html参考过来的: 第一节:Redis 简介 为什么需要NoSQL,主要应对以下问题,传统关系型数据库 ...
- 字符串分割split()
知识讲解: split() 方法将字符串分割为字符串数组,并返回此数组. 语法: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...
- eclipse安装、汉化、搭建安卓开发环境
1.eclipse与jdk的位数(32bit or 64bit )要对应,否则会提示Failed to load JNI shared library.提示这一种错误据说还有另外一种原因就是Path路 ...
- 基于Html的SEO(很基础,更是前端必须掌握之点)
文章来源:百度文库 Html代码seo优化最佳布局,实例讲解 众所周知,搜索引擎对html代码是非常优化的,所以html的优化是做好推广的第一步.一个符合seo规则的代码大体如下界面所示. ...
- tcpdump命令(转载)
https://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html 简介 用简单的话来定义tcpdump,就是:dump the tra ...
- Mysql配置参数sync_binlog说明
Mysql配置参数sync_binlog说明 mysql> select version(); +-----------+ | version() | +-----------+ | | +-- ...
- confluence部署与破解
一.confluence安装 #安装环境环境 centos7.jdk8.mysql5.7.Confluence6.14.1 confluence下载地址 wget https://product-do ...
- MCC MNC in china
A mobile country code (MCC) is used in combination with a mobile network code (MNC) (a combination k ...
- Linux打开TCP BBR拥塞控制算法
要求内核为4.9以上,如果不是,请升级内核. modprobe tcp_bbr echo "tcp_bbr" >> /etc/modules-load.d/module ...