文章目录

  • gradients and edge detection梯度和边缘检测
    • 1 laplacian拉普拉斯算子
    • 2 sobel算子
    • 3 canny edge detector边缘探测
  • contours轮廓
    • 1 counting coins数硬币
    • 2 crop coins裁切提取硬币

gradients and edge detection梯度和边缘检测

边缘检测,就是用数学方法找出一幅图像中像素值突变的点。

第一件事,就是找出灰度图像中的梯度,在x方向和y方向中找出可能有边缘的区域。

接着我们会使用canny边缘检测,包括图像降噪,找到图像梯度(利用在水平和竖直方向上的sobel核),非最大值抑制non-maximum suppresion,和滞后阈值hysteresis thresholding。

1 laplacian拉普拉斯算子

# 注意从黑向白映射是一个正的斜坡函数,但从白向黑映射是一个负的斜坡函数
# 所以需要用cv2.CV_64F这种格式
lap = cv2.Laplacian(image, cv2.CV_64F)
lap = cp.uint8(np.absolute(lap))
cv2.imshow("Laplacian", lap)

2 sobel算子

# 水平梯度
sobelX = cv2.Sobel(image, cv2.CV_64F, 1, 0)
sobelX = np.uint8(np.absolute(sobelX))
cv2.imshow("Sobel X", sobelX)
# 垂直梯度
sobelY = cv2.Sobel(image, cv2.CV_64F, 0, 1)
sobelY = np.uint8(np.absolute(sobelY))
cv2.imshow("Sobel Y", sobelY)
# 结合x和y两个方向的梯度
sobelCombined = cv2.bitwise_or(sobelX,sobelY)
cv2.imshow("Sobel Combined", sobelCombined)

3 canny edge detector边缘探测

canny边缘探测是一个多步骤的过程,涉及到滤波降噪,计算sobel在两个方向上的梯度,边缘抑制suppressing edeges,和滞后阈值hysteresis thresholding,最终决定一个像素是否像是个边缘。

# 所有的梯度和边缘探测算子都需要转换成灰度图
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 仅canny需要使用模糊
image = cv2.GaussianBlur(image, (5,5), 0)
# 使用canny算子
# 第一个阈值表示低于30的梯度将不会被判定成边缘
# 第二个阈值表示超过150的梯度才会被判定成边缘
canny = cv2.Canny(image, 30, 150)

contours轮廓

轮廓是一条曲线上的点,并且这条曲线没有间断。

怎样找到图像的轮廓呢,首先要获得二值化图像,无论是使用边缘检测还是二值化。接下来是一个使用canny边缘检测算子来找出硬币的轮廓,然后找到实际硬币的轮廓的例子。

1 counting coins数硬币

# 基础处理,二值化,模糊,探测边缘
gray = cv2.cvtColor()
blurred = cv2.GaussianBlur()
edged = cv2.Canny(blurred, 30, 150)
cv2.imshow("Edges", edged)# 第二个参数表示返回外围最大轮廓,如果使用cv2.RETR_LIST可以返回所有轮廓
# 第三个参数表示分层架构,还可以使用cv2.RETR_COMP和cv2.RETR_TREE
(_, cnts, _) = cv2.findCoutours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print("{} coins in this image".format(len(cnts)))coins = image.copy()
# 参数分别表示画布,轮廓,轮廓序号(-1代表全部),颜色,线条宽度
cv2.drawCountours(coins, cnts, -1, (0,255,0), 2)
cv2.imshow("coins", coins)

2 crop coins裁切提取硬币

for (i,c) in enumerate(cnts):# 裁切出一块长方形区域,用来放圆形(x,y,w,h) = cv2.boundingRect(c)print("coin #{}".format(i+1))coin = image[y:y+h, x:x+w]cv2.imshow("Coin", coin)# 新建一块大的画布 mask = np.zeros(image.shape[:2], dtype = "uint8")# 找出轮廓圆的圆心和半径# 输入为轮廓,输出为圆心和半径((centerX,centerY),radius) = cv2.minEnclosingCircle(c)# 画出圆,这些圆本质上是一个白色蒙版,mask成为一个遮罩cv2.circle(mask,(int(centerX), int(centerY)), int(radius), 255, -1)# 把mask缩小到和coin一样大的长方形区域mask = mask[y:y+h, x:x+w]cv2.imshow("Masked Coin", cv2.bitwise_and(coin,coin,mask = mask))

OpenCV-python学习笔记(六)——梯度算子,边缘检测和轮廓提取相关推荐

  1. Python学习笔记六——画小猪佩奇

    目录 Python学习笔记六--画小猪佩奇 画布 画笔 属性设置 操纵命令 运动命令 画笔控制命令 全局控制命令 其他命令 Python学习笔记六--画小猪佩奇 使用Python的turtle库可以绘 ...

  2. Python学习笔记(六)

    1. IO编程 1.1 文件读写 1.2 StringIO和BytesIO 1.3 操作文件和目录 1.4 序列化 2. 进程和线程 2.1 多进程 2.2 多线程 2.3 ThreadLocal 2 ...

  3. opencv进阶学习笔记11:cannny边缘检测,直线检测,圆检测

    基础版笔记传送门 python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) cannny边缘检测 基础版边 ...

  4. python学习笔记六 初识面向对象上(基础篇)

    python面向对象 面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲,OOP不是一个很容易理解的编程方式,虽然大家都知道OOP的三大特性是继承. ...

  5. 【懒懒的Python学习笔记六】

    大多数程序旨在最终解决用户问题,为此通常需要从用户那里输入信息,在本章学习中,我们将学习Python的raw_input()函数接受用户输入以及学习while循环来控制程序的运行. 函数raw_inp ...

  6. Python学习笔记六(Python time模块)

    通过python time模块提供的函数和方法可以获取与时间相关的操作,例如:获取系统时间,统计程序执行时间,WEB程序的响应时间等. 1)time.time(),该函数返回从1970年1月1日0点0 ...

  7. Python学习笔记(六)Python基础_数据类型——字符串

    文章目录 字符串 字符串输入 字符串拼接 字符串操作 字符串格式化 访问字符串中的值 字符串切片 字符串遍历 常用的字符串方法 字符串 字符串是 Python 中最常用的数据类型:一般以使用引号' ' ...

  8. openCV Python学习笔记(二)画几何

    此处要花几何图形,我们需要用到如下几个函数: cv2.line 画线函数 cv2.circle 画圆函数 cv2.ellipse 画椭圆 cv2.rectangle 画矩形 1.画线 img=cv2. ...

  9. python学习笔记六:Series

    Series是一种类似于一维数组的对象,由以下两部分组成: values:一组数据(ndarray或list类型) index:相关的数据索引标签 一维数组默认索引为0,1,2,3...,而Serie ...

  10. Python学习笔记(六)—几个标准类型内建函数

    比如说cmp(),str(),type(),repr()等等 cmp(a,b)比较a和b,根据比较的结果返回一个整数i. 当a<b时返回i<0;(即-1) 当a>b时返回i>0 ...

最新文章

  1. android ScrollView滚动距离和判断滚动停止状态
  2. 一文整理IEEE问题汇总【IEEE PDF Checker】(更新中)
  3. ActiveMQ简述
  4. 2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)
  5. 实例41:python
  6. Python机器学习:决策树002信息熵
  7. PyYAML和configparser模块讲解
  8. 建造者模式 php,PHP设计模式之建造者模式定义与用法简单示例
  9. SSM高校疫情防控出入信息管理系统设计与实现.rar(论文+源码)
  10. 未知USB设备(设备描述符请求失败)终于解决。网上查到的所有方法我都试过了,全部失败。我的成功方法就是调整“电源选项”
  11. 开源示波器DS203介绍、原理图学习
  12. SAP打开财务和物料的账期(OB52 MMRV MMPV)
  13. 计算机上的波特率标准,电子信号术语-波特率9600计算单位是波特/每秒(B/s)
  14. Cannot autogenerate id of type java.lang.Integer for entity
  15. Android开发经验谈:微信小程序的事件处理,灵魂拷问
  16. android新特性:DrawerLayout与NavigationView配合使用
  17. FLIR E85/E95/T620/t610/T540/T530红外热像仪全齐
  18. vue使用luckySheet前端excel的在线表格,导入显示以及导出excel文件
  19. 程序员必须认识的5件事情(ipvb学习网)
  20. GPC凝胶色谱理论和应用(二)

热门文章

  1. 持续集成部署Jenkins工作笔记0003---Web工程部署方式说明
  2. Netty工作笔记0003---IO模型-BIO-Java原生IO
  3. android学习笔记---61_Widgets,窗口小部件的制作...
  4. pytorch DistributedDataParallel提示未参与loss计算的变量错误
  5. Bezier曲线扫盲
  6. 用phpcms如何将静态页面制作成企业网站(上)
  7. WORD2010每次启动都要配置
  8. MyEclipse中使用Proxool+mysql连接池的方法
  9. easyui分页查询为什么会有下拉框_6个针对MySQL大数据量分页查询优化的锦囊妙计...
  10. 大数据日知录_腾讯T4专家精心整理:java+大数据+机器学习+数据挖掘+算法大集结...