在上一个博文中,高斯滤波后对灰度值用canny检测边缘。调整canny参数,检测边缘。下面换一种方式,即先二值化后,再findContours检测检测轮廓。

图像二值化

cv2.threshold(), cv2.adaptiveThreshold(), Otsu’s thresholding.

简单阈值划分

cv2.threshold(InputArray src, int threshold, int maxValue, int thresholdType)

函数返回两个量,retVal和阈值转换后的图像thresholded image。其中,第一个值retVal是在使用Ostu时,返回Ostu最优阈值;否则,则返回自己设置的阈值,例如127。

  • scr 输入图像
  • thresholf 分割阈值
  • maxValue 超过阈值后设定为最大值
  • thresholdType 阈值类型,一共有5种类型表示二值化的图片处理方式。cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV是最常见的两种,前者表示大于阈值的取最大值(255),小于阈值的取最小值0;后者,小于阈值的取最大值(255),大于阈值的取最小值0。

自适应阈值划分

cv2.adaptiveThreshold((InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)

  • src:输入图
  • dst:输出图,大小与原图一致
  • maxValue:最大值,同上
  • adaptiveMethod:
    自适应方法,分为局部均值法CV_ADAPTIVE_THRESH_MEAN_C和高斯均值法CV_ADAPTIVE_THRESH_GAUSSIAN_C
  • thresholdType:二值化类型,只有两种:cv2.THRESH_BINARY和cv2.THRESH_BINARY_INV。
  • blockSize:均值计算区域,只能选奇数3,5,7……。
  • C:常数,区域均值后减去该常数。

其中,与全局均值作为阈值不同的,自适应法,是采用局部均值的方法来处理每个小区域。这样做可以排除,光线条件差异引起的图片整体明暗度的差异。

具体的,局部均值法CV_ADAPTIVE_THRESH_MEAN_C,计算blockSize * blockSize区域内的均值,减去常数C,作为该区域阈值;高斯均值法CV_ADAPTIVE_THRESH_GAUSSIAN_C ,计算blockSize * blockSize区域内的高斯均值(Gaussian Blur),减去常数C。

左上是全局threshold=127划分的效果,光线条件不同,由于反光等使得阈值划分效果很差。右上是局部均值法;左下是高斯均值法,都采用了blockSize=11,差异并不明显。右下,高斯均值法,阈值类型为cv2.THRESH_BINARY_INV。

Otsu’s Binarization

现在假设,我们有了二值化分割的图像,那么问题是,如何判定分割的好坏呢?现考虑一个双峰图像,对于有明显双峰的图像,可以设定阈值为在两个峰之间的某个值,Otsu就是这样一种方法。Ostu的原理,寻找一个阈值,使得类间方差最小化。他为双峰图像计算阈值,然而对非双峰图像不太准确。对于一个双峰图像,用Ostu来选择阈值,可以使得前景,背景区分明显。

运用Ostu计算处理图像的方法,cv2.THRESH_OTSU
ret,th = cv2.threshold(img,0,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)

官方文档中还有关于Ostu的实现。

参考文献:

http://www.ruanyifeng.com/blog/2012/11/gaussian_blur.html
http://monkeycoding.com/?p=603
https://blog.csdn.net/wenhao_ir/article/details/51565517
https://docs.opencv.org/3.1.0/d7/d4d/tutorial_py_thresholding.html

【图像识别】初探数字识别-水表(2)相关推荐

  1. 【图像识别】初探数字识别-水表(3)

    轮廓检测 之前用的方法还是不能直接分割出待识别的数字区,下面尝试新的方法. 运用OpenCV findContours函数检测图像所有轮廓: 对于检测出的轮廓,contourArea限制轮廓所包围的面 ...

  2. 2021全国电设(F题)openmv的图像识别之数字识别

    基于openmv的图像识别 通过参加全国电子设计大赛F题总结出openmv4的数字识别(其它版本暂时没试过,欢迎交流!) openmv简介 OpenMV是一个开源,低成本,功能强大的机器视觉模块,以S ...

  3. 图像识别:利用KNN实现手写数字识别(mnist数据集)

    图像识别:利用KNN实现手写数字识别(mnist数据集) 步骤: 1.数据的加载(trainSize和testSize不要设置的太大) 2.k值的设定(不宜过大) 3.KNN的核心:距离的计算 4.k ...

  4. 【Matlab数字识别】数字仪表图像识别【含源码 693期】

    一.代码运行视频(哔哩哔哩) [Matlab数字识别]数字仪表图像识别[含源码 693期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] 蔡利梅.MATLAB ...

  5. Tensorflow 学习入门(二) 初级图像识别——手写数字识别

    初级图像识别--手写数字识别 背景知识储备 Softmax Regression MNIST 矩阵相乘 One Hot 编码 Cross Entropy(交叉熵) 代码实现 引入数据 设计数据结构 完 ...

  6. 机器学习初探(手写数字识别)HOG图片

    这里我们讲一下使用HOG的方法进行手写数字识别: 首先把 代码分享出来: hog1.m function B = hog1(A) %A是28*28的 B=[]; [x,y] = size(A); %外 ...

  7. 神经网络初探(BP 算法、手写数字识别)

    神经网络的结构就不说了,网上一大堆-- 这次手写数字识别采用的是 sigmoid 激活函数和 MSE 损失函数. 虽然网上说这种方式比不上 softmax 激活函数和交叉熵损失函数,后者更适合用于分类 ...

  8. 图像识别技术解析:手写数字识别(一)

    本文通过构建一个手写数字识别的程序来解析来自机器学习与深度学习的不同算法的特点,以及如何对识别效果进行改进. 一.如何构建一个手写数字识别程序 首先可以考虑构建一个简单的页面用于用户输入,也就是前端: ...

  9. 【opencv】(9) 图像识别实战:银行卡数字识别,附python完整代码和数据集

    各位同学大家好,今天我和大家分享一下opencv机器视觉实战项目,识别银行卡上的数字,该方法也同样适用于车牌数字识别. 数据集免费: https://download.csdn.net/downloa ...

最新文章

  1. 【C++】clipp 一个命令行参数解析器
  2. 在macos上基于python2.7安装PyQt5
  3. windows10 Selenium Chrome 驱动安装
  4. css(面试第2天)用css绘制三角形
  5. 第六周作业(sticky
  6. Java多线程之Callable、Future和FutureTask
  7. C语言 | 结构体指针
  8. 野火IMJAVA开发的即时通讯系统源码
  9. 3D-BoNet:比3D点云实例分割算法快10倍!代码已开源
  10. jQuery each、节点操作、动画演示、尺寸操作、扩展方法
  11. 诺基亚7plus支持html,【诺基亚7Plus评测】外观:全面屏是最大亮点_诺基亚 7 Plus(4GB RAM/全网通)_手机评测-中关村在线...
  12. R语言中判断是否是整数。以及读写excel
  13. 深信服单点登入代理服务取AD
  14. Syncovery for mac(文件备份和同步工具)
  15. c语言从入门到精通真垃圾,从入门到精通的C语言(吐血量)
  16. 常见EDA软件的license管理
  17. Java Cryptography
  18. Verilog GPIO 模块设计
  19. HAU寒假训练第一周
  20. nyoj779兰州烧饼

热门文章

  1. 我一名cisco培训讲师,我也谈点体会
  2. 用画笔留下北京古城墙最后遗照的人:张先得
  3. 终极求生手机(待机15年的)
  4. 匿名社交:在安全和危险边缘摇摆
  5. 硬件系列(九)--------串口扫码头数据读写
  6. 关于互联网金融贷款业务的整体梳理
  7. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-980 斐波那契串
  8. 戴尔服务携手SAP助力中国企业全球化发展
  9. python图像分类整理_python常见图形代码可视化大全整理(包括动图)更新中...
  10. CAD中怎么画孔?机械CAD构造孔教程