学习目标:

  • 学习简单阈值,自适应阈值,Otsu’s 二值化等
  • 学习函数cv2.threshold,cv2.adaptiveThreshold 等。

一、简单阈值

与名字一样,这种方法非常简单。但像素值高于阈值时,我们给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。我们要用到的函数就是cv2.threshold,下面介绍他的参数。

  • cv2.threshold()函数中四个参数分别是原图像、阈值、最大值、阈值类型。这个函数有两个返回值,第一个为 retVal,即阈值,第二个就是阈值化之后的结果图像了。原图像应该是灰度图,阈值类型一般分为五种,如下所示:

cv2.THRESH_BINARY——大于阈值的部分像素值变为最大值,其他变为0
        cv2.THRESH_BINARY_INV——大于阈值的部分变为0,其他部分变为最大值
        cv2.THRESH_TRUNC——大于阈值的部分变为阈值,其余部分不变
        cv2.THRESH_TOZERO——大于阈值的部分不变,其余部分变为0
        cv2.THRESH_TOZERO_INV——大于阈值的部分变为0,其余部分不变

import cv2

img = cv2.imread('/home/wl/le.jpeg',0)

ret,thresh = cv2.threshold(img,175,255,cv2.THRESH_BINARY)

while(1):
cv2.imshow('opencv',thresh)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',thresh)
cv2.destroyAllWindows()

原图:

效果图:

二、自适应阈值

在前面的部分我们使用是全局阈值,整幅图像采用同一个数作为阈值。当时这种方法并不适应与所有情况,尤其是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。要用到的函数是cv2.adaptiveThreshold(),下面介绍其参数。

  • cv2.adaptiveThreshold()共有六个参数,返回值只有一个,即阈值化之后的结果图像。
  1. 第一个参数是原图,应该为灰度图;
  2. 第二个参数是最大值;
  3. 第三个参数是计算阈值的方法,有两种方法:cv2.ADPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平
    均值、cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取值相邻区域的加权和,权重为一个高斯窗口。
  4. 第四个参数是取阈值类型,必须是下者之一, cv2.THRESH_BINARY或  cv2.THRESH_BINARY_INV。
  5. 第五个参数是block_size,指用来计算阈值的象素邻域大小: 3, 5, 7, ..
  6. 第六个参数是是一个常数,阈值就等于的平均值或者加权平均值减去这个常数。
import cv2

img = cv2.imread('/home/wl/le.jpeg',0)

thresh = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,5)

while(1):
cv2.imshow('opencv',thresh)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpeg',thresh)
cv2.destroyAllWindows()

三、Otsu’s 二值化

在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)。这里用到到的函数还是 cv2.threshold(),但是需要多传入一个参数(flag):cv2.THRESH_OTSU。这时要把阈值设为 0。然后算法会找到最优阈值,这个最值就是返回值 retVal。如果不使用 Otsu 二值化,返回的retVal 值与设定的阈值相等。

import cv2
img = cv2.imread('/home/wl/le.jpeg',0)
ret,thresh = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
while(1):
cv2.imshow('opencv',thresh)
k = cv2.waitKey(1)& 0XFF
if k == ord('q'):
break
cv2.imwrite('/home/wl/1.jpg',thresh)
cv2.destroyAllWindows()

Opencv笔记(九)——图像阈值的更多相关文章

  1. OpenCV学习笔记(7)——图像阈值

    简单阈值,自适应阈值,Otsu's二值化等 1.简单阈值 当像素值高于阈值时,我们给这个像素赋予一个新值,否则给他赋予另一个值.这个函数就是cv2.threshhold().这个函数的第一个参数就是原 ...

  2. opencv笔记2:图像ROI

    time:2015年 10月 03日 星期六 12:03:45 CST # opencv笔记2:图像ROI ROI ROI意思是Region Of Interests,感兴趣区域,是一个图中的一个子区 ...

  3. opencv学习之路(13)、图像阈值化threshold

    一.图像阈值化简介 二.固定阈值 三.自适应阈值 #include<opencv2/opencv.hpp> using namespace cv; void main(){ Mat src ...

  4. Python下opencv使用笔记(图像频域滤波与傅里叶变换)

    Python下opencv使用笔记(图像频域滤波与傅里叶变换) 转载一只程序喵 最后发布于2018-04-06 19:07:26 阅读数 1654  收藏 展开 本文转载自  https://blog ...

  5. opencv笔记4:模板运算和常见滤波操作

    time:2015年10月04日 星期日 00时00分27秒 # opencv笔记4:模板运算和常见滤波操作 这一篇主要是学习模板运算,了解各种模板运算的运算过程和分类,理论方面主要参考<图像工 ...

  6. opencv笔记6:角点检测

    time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...

  7. OpenCV笔记大集锦(转载)

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  8. opencv笔记5:频域和空域的一点理解

    time:2015年10月06日 星期二 12时14分51秒 # opencv笔记5:频域和空域的一点理解 空间域和频率域 傅立叶变换是f(t)乘以正弦项的展开,正弦项的频率由u(其实是miu)的值决 ...

  9. opencv笔记3:trackbar简单使用

    time:2015年 10月 03日 星期六 13:54:17 CST # opencv笔记3:trackbar简单使用 当需要测试某变量的一系列取值取值会产生什么结果时,适合用trackbar.看起 ...

  10. opencv笔记1:opencv的基本模块,以及环境搭建

    opencv笔记1:opencv的基本模块,以及环境搭建 安装系统 使用fedora22-workstation-x86_64 安装opencv sudo dnf install opencv-dev ...

随机推荐

  1. stm32h7 开发板学习

    按键和 IO 之间连接一个 1K 电阻,可以防止当 IO 被配置为高电平输出的时候,按下按键,导致 VDD 和 GND 直接连通.

  2. Innodb特性以及实现原理

    Innodb五大特性 1.insert buffer2.double write3.自适应哈希索引4.异步io5.邻接页刷新 1.insert buffer(change buffer) 作用:将非聚 ...

  3. LINUX文件目录存放文件说明

    /bin bin是Binary的缩写.这个目录存放着最经常使用的命令. /boot这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件. /dev dev是Device(设备) ...

  4. VBE2019的下载、安装和使用(最新版2020.2.22)

    VBE2019可用于XP系统.Windows 7和Windows 10的32位.64位Office对应的VBA环境 安装包下载地址:VBE2019-Setup.zip 下载后解压缩,直接双击安装(请勿 ...

  5. SpringCloud学习之Stream消息驱动【自定义通道】(十一)

    如果不清楚本篇内容的,请务必先去看完上一篇再看本篇,否则阅读起来可能会有部分障碍和困难: 上一篇文章<SpringCloud学习之Stream消息驱动[默认通道](十)>我们简单用自定义通 ...

  6. Cracking Digital VLSI Verification Interview 第二章

    Computer Architecture 对Cracking Digital VLSI Verification Interview:Interview Success这本书的汉化,最新更新请关注微 ...

  7. 程序员必备:详解XSS和CSRF

    做开发的小伙伴想必都不陌生XSS 和 CSRF,但也有一些刚接触的朋友还不是很清楚,今天就给大家详解下XSS和CSRF! 一.XSS xss,即 Cross Site Script,中翻译是跨站脚本攻 ...

  8. this 深度面试题3

    window.val = 1; var obj = { val: 2, dbl: function () { this.val *= 2; val *= 2; console.log(val); co ...

  9. C#-类型转换和引用转换

    对象的引用可以被: 隐式地向上转换 显示的向下转换 向上转换 向上转换是指一个从一个基类指向一个子类: House house = new House(); Asset asset = house; ...

  10. Pyspider的简单介绍和初使用

    Pyspider   Pyspider是由国人(binux)编写的强大的网络爬虫系统 Ptspider带有强大的WebUi / 脚本编辑器 / 任务监控器 / 项目管理器以及结果处理器.他支持多种数据 ...