Opencv中的Threshold用法(二值化图像)

Threshold,译为阈值 。什么叫阈值呢?通俗点说,就是分界线。就像我们平时考试的时候,会以60分作为一个阈值,超过60分的,会认为是及格,低于60分的就是不及格。

这个60分就是阈值,分界值。用这个函数,我们可以令图像灰度大于阈值的,为一个值,低于阈值的,为另一个值。这就可以实现图像的二值化。

如果你细想上面那句话,会发现提到了灰度。因为在使用Threshold的时候,需要使用灰度图像。如果是RGB图像,3个通道上都有值,这个时候,的确不符合Threshold的设计初衷。


Threshold用法
retVal, thresh = cv2.threshold(需要处理的图像,阈值,分配的值,阈值处理模式选择)

输入:

参数1,需要处理的图像:注意,需要处理的图像需要被转成灰度图像(后面小试一下部分会讲解)

参数2,阈值:设定阈值,分界值

参数3,分配的值:如果一个像素的灰度值,大于或者小于(取决于参数4的选择)阈值,会被赋予分配的值

参数4,阈值处理模式选择:(下面讲解)

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

输出:

retVal,在这些用法中,可以简单理解为返回输入参数中的阈值。

thresh,返回处理后的图像。


阈值处理模式选择

我们先来理解下中文意思,这样就比较好理解。

BINARY,binary,是二值化的意思。

INV,inverted,反转,意味着会将情况反转,处理方式与之前相反。

TRUNC,truncate,截断,还是以成绩为例,如果设置阈值为60,即便你考了100分,也会被判定为60分。如果考了50分,则保持不变,还会被判定为50分。

TOZERO,threshold to zero。有的大学成绩是这样的,如果高于60分,分数在系统会正常显示,如果低于60分,则不会显示分数,一般显示为不及格。只不过在opencv中,是被显示为0。

看懂这张图就基本理解了,都是分段函数。

在这里插入图片描述

  1. THRESH—BINARY

    • 如果像素值大于阈值,像素值就会被设为参数3
    • 小于等于阈值,设定为0
  2. cv2.THRESH_BINARY_INV

    这个是上面一种情况的反转

    • 如果像素值大于阈值,像素值为0
    • 小于等于阈值,设定为参数3
  3. cv2.THRESH_TRUNC

    • 如果像素大于阈值,设定为阈值
    • 小于等于阈值,保持原像素值
  4. cv2.THRESH_TOZERO

    • 大于阈值,保持原像素值
    • 小于等于,设定为0
  5. cv2.THRESH_TOZERO_INV

    与上一种相反

    • 大于阈值,设定为0
    • 小于等于,保持原像素值

小试一下

主要目的:

  • 验证各个参数的作用,特别是输出参数retVal
  • 使用常用的THRESH_BINARY模式
  • 看看如果输入彩色图像会怎么样

先来看下如何灰度化图像

要处理的图像是这样,强行彩色(日常打广告,欢迎大家关注一波,一个想写出通俗易懂教程的人)

015

需要使用到这个函数

image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

cvtColor,全写是,Convert color,转换颜色。

输入是需要转换的图像,以及转换的模式,COLOR_RGB2GRAY,意为从RGB彩色图像to(2) GRAY灰度图像。

我们看下输出(opencv图像显示请看这

import cv2
#读取图像
image = cv2.imread('015.jpg')
#灰度转换
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
#图像显示
cv2.imshow('grayimg',image)
cv2.waitKey(0)

输出结果:

016

我们想让中间的logo,人物和背景尽量分离。用到二值化

分析:人物的灰度比较低,背景的灰度比较高,所以假定设定阈值为50,让背景大于大于,赋值255,即为白色。任务低于阈值,为0,即为黑。

import cv2
#读取图像
image = cv2.imread('015.jpg')
#灰度转换
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
#二值化
retVal,image = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)
#尝试看看输出参数
print(retVal)
#图像显示
cv2.imshow('grayimg',image)
cv2.waitKey(0)

输出结果为50,即为设定的阈值

图像:

017

如果未灰度化,直接处理的话

发现,也是可以运行的

018

  • 36
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值