学习目标:

  • 学习简单阈值,自适应阈值,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. QF中间件

    QF中间件使用说明          QF中间件是在2020年春节期间出现新型冠状病毒感染的肺炎疫情不敢外出,闲来无事编写的.编程是业余爱好,平时编程只会拖控件,中间件可能存在未知Bug,这个版本也只 ...

  2. 全面掌握Nginx配置+快速搭建高可用架构 一 开启status页面检测服务状态

    输入命令Nginx -V 打开conf.d/default.conf 配置模块,配置位置在server或者location 配置完成后测试语法正确 nginx -tc /etc/nginx/nginx ...

  3. Aizu 2155 Magic Slayer 背包DP

    这是上上次对抗赛的题目了 其实现在发现整个代码从头到尾,都是用了背包,怪我们背包没深入学好. 比赛的时候,聪哥提出的一种思路是,预处理一下,背包出 ALL攻击 和 single攻击的 血量对应的最小花 ...

  4. k8s中解决容器时差问题

    解决k8s的pod容器的时差常用的两种方式: 1.通过设置pod 模板中的环境变量 env解决 在pod的模板中添加以下: apiVersion: v1 kind: Podmetadata:   na ...

  5. salt如何查看文档帮助

    1.查看普通模块和函数使用方法 salt 'minion' sys.doc  module_name salt ‘minion'  sys.doc module_name.function_name ...

  6. mysql字符类型总结及常用字符函数

    常用字符串函数: concat(s1,s2,s3..)       连接s1,s2,...sn为一个字符串 INSERT(str,x,y,instr)将字符串str从x位置开始,y个字符串替换为字符串 ...

  7. Docker MongoDB 集群搭建

    简单地在Docker环境上搭建一个无认证的MongoDB集群.1.本文使用的容器集群角色 ContainerName IP:portConfig Server cfg_1    10.1.1.2:27 ...

  8. 使用idea出现的错误

    错误:打开maven项目时出现"程序包 com.sun.org.apache.xpath.internal 不可见 "的错误 这个问题出现的原因是: jdk版本的问题.可能是因为有 ...

  9. JavaScript学习总结(五)

    之前的几讲中我们曾经说过,JavaScript中是没有类的概念的.但是我们讲过对象,那么这个对象是怎么来的呢? 只要有函数即可创建对象 自定义对象 自定义对象的方式: 1. 使用无参的函数创建对象 & ...

  10. Java线程——线程之间的几点重要说明

    在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信.在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调 ...