python-opencv第四期:threshold函数详解

概要: 众嗦粥汁所周知,在如今计算机视觉(Computer Version short for CV)是人工智能与机器人技术发展的一个重大研究方向,而opencv作为一个专门为机器视觉编程提供技术与函数支持的第三方库,自然是一个需要重点研究的内容。

            本期所要介绍的函数是opencv库中的函数——threshold

            thresold函数的主要作用是图像阈值分割,利用图像中像素像素值大小的差别,选择一个适当的阈值,将图像分割为目标区域(target_area)与背景区域(background_area),生成一个我们需要的二值图像,主要特点是黑白分明。(什么是黑白分明~~是是非非谁人会懂~~)。二值图将为我们裁剪目标区域,进行目标识别与分析剔除不必要的背景区域,消除不必要区域对于图像处理的干扰。

            本期依旧是请出“饥荒”(就逮着一只羊薅羊毛)中的角色“沃尔夫冈”(下图可见)作为我们本期文章的演示素材嘉宾。他在强壮时期强壮如牛,瘦弱时期瘦弱如鼠(肾虚)的特点完美符合二值图黑白分明的特点。话不多说,我是Kamen Black君,马上开始今天的学习,我已经等不及力

a1b740978dc44cf596d1a4ffa81c938a.png​ 

 正文部分:

f05860e073cb45d6af5d75e158535612.jpeg

 

print("祝大家每天快乐,love and peace!")

①使用准备:

与前几期一样,依旧是调用我们的工具人老伙伴—-opencv,作为我们使用threshold的大前提。

import cv2

②适用情况(新内容):

图像阈值分割一般适用于背景区域与目标区域像素值分别较大的情况。只有当两者之间的区别较大时,才能够较为容易地找到一个适当的阈值作为区别两者的分界线,不然如果两者之间的灰度值差异不明显,就可能会导致区域的错误划分,或者是阈值的难以选择,抑或是得不到封闭的单连通区域,这会使得后续的目标裁剪变得复杂与困难。(只怕是藕断丝连~~一切都是难舍难分~~

③语法说明:

使用语法:thresh,result=cv2.threshold (src, thresh, maxval, type)

参数说明:thresh为设定的阈值,取值范围即为灰度值的范围0~255,数据类型为浮点型(输入可以为整型);

                  result为进行阈值分割后的结果图像,数据类型为整数矩阵;

                  src为被进行分割的源图像,一般为单通道的灰度图,但三通道的RGB图像也可以进行处理(但可能只根据第一个通道的大小进行处理(所谓枪打出头鸟))

                  maxval为最大值,为分割后的图像所取到的灰度最大值

                  type为阈值分割的类型,常用的有THRESH_BINARY、THRESH_BINARY_INV、THRESH_TOZERO、THRESH_TOZERO_INV。具体的说明可见下表所示:

threshold types说明
THRESH_BINARY灰度值超过阈值的像素设置为最大灰度值,不超过的设置为0
THRESH_BINARY_INV灰度值不超过阈值的像素设置为最大灰度值,超过的设置为0
THRESH_TOZERO灰度值低于阀值的像素设为0灰度值
THRESH_TOZERO_INV灰度值高于阀值的像素设为0灰度值
THRESH_TRUNC灰度值超过阈值的像素设为阈值的灰度值
THRESH_MASK掩码
THRESH_OTSU标记,使用大津算法来选择最佳阈值,只支持8位单通道图像
THRESH_TRIANGLE标记,使用TRIANGLE算法来算则最佳阈值,只支持8位单通道图像

另附上cv2.threshold函数的原生文档说明(有道翻译是个好东西(有道还不打钱)) 

def threshold(src, thresh, maxval, type, dst=None): # real signature unknown; restored from __doc__
    """
    threshold(src, thresh, maxval, type[, dst]) -> retval, dst
    .   @brief Applies a fixed-level threshold to each array element.
    	
    .   
    .   The function applies fixed-level thresholding to a multiple-channel array. The function is typically
    .   used to get a bi-level (binary) image out of a grayscale image ( #compare could be also used for
    .   this purpose) or for removing a noise, that is, filtering out pixels with too small or too large
    .   values. There are several types of thresholding supported by the function. They are determined by
    .   type parameter.
    	
    .   
    .   Also, the special values #THRESH_OTSU or #THRESH_TRIANGLE may be combined with one of the
    .   above values. In these cases, the function determines the optimal threshold value using the Otsu's
    .   or Triangle algorithm and uses it instead of the specified thresh.
		
    .   
    .   @note Currently, the Otsu's and Triangle methods are implemented only for 8-bit single-channel images.
    	
    .   @param src input array (multiple-channel, 8-bit or 32-bit floating point).
    	
    .   @param dst output array of the same size  
    	and type and the same number of channels as src.	
    	
    .   @param thresh threshold value. 
    .   @param maxval maximum value to use with the #THRESH_BINARY and #THRESH_BINARY_INV thresholding
    .   types.
		
    .   @param type thresholding type (see #ThresholdTypes).
    	
    .   @return the computed threshold value if Otsu's or Triangle methods used.
    .   
    .   @sa  adaptiveThreshold, findContours, compare, min, max
    """
    pass

④实例操作:

下面通过几个简单的操作,给大家呈现一下参数不同的情况下对图片处理情况的不同(沃尔夫冈大放送(bushi)):

1、掉色的沃尔夫冈:

>>> src=cv2.imread("F://src.png")
>>> thresh,result0=cv2.threshold(src,80,255,cv2.THRESH_BINARY)

a98f20767a0d4e8db6c49e98879ec7e1.jpeg

 

2、白纸黑字的沃尔夫冈:

>>> gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
>>> thresh,result1=cv2.threshold(gray,80,255,cv2.THRESH_BINARY)

ede7666c50f7479fa55277655146b11d.jpeg

 

3、黑纸白字的沃尔夫冈:

>>> gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
>>> thresh,result2=cv2.threshold(gray,80,255,cv2.THRESH_BINARY_INV)

b3f790806758487290de6b634d32de38.jpeg

 

4、网抑云的沃尔夫冈:

>>> gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
>>> thresh,result3=cv2.threshold(gray,80,255,cv2.THRESH_TOZERO)

24c276b6ed7f47ac9b9d7926a7713a6a.jpeg

 

5、底片的沃尔夫冈:

>>> gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
>>> thresh,result4=cv2.threshold(gray,80,255,cv2.THRESH_TOZERO_INV)

f7ebd6706c6e44dd93bf2f6464087441.jpeg

 

6、素描的沃尔夫冈:

>>> gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
>>> thresh,result5=cv2.threshold(gray,80,255,cv2.THRESH_TRUNC)

8ac41873fed74043b734219dbff8c851.jpeg

PS:一个小知识:threshold在英语中的原意是“门槛”的意思,在这里就延伸了它的意思,引申出了“阈值、限值”的内涵。看我的博客还能学英语,这样的宝藏博主还不赶快关注起来:> 

沃尔夫冈:多少有点臭不要脸了 

结语:本期中我们学习了threshold函数,了解到opencv中用来进行图像阈值切割的方法,学会了将目标区域与背景区域分离开来的方式,也学会使用不同的threshold类型来对图像作不同类型的阈值切割处理,这些对于我们进一步对于目标区域进行识别都有很大的帮助。

好了以上就是所有的内容,希望大家多多关注,点赞,收藏,这对我有很大的帮助。谢谢大家了!

e63444f11e4844da927650cfd1d40197.gif

 

好了,这里是Kamen Black君。祝国康家安,大家下次再见喽!!!溜溜球~~

 7f79687925634801ac75cc10f553ff08.jpeg

 

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
心中带点小风骚的头像心中带点小风骚普通用户
上一篇 2023年3月1日 上午8:38
下一篇 2023年3月1日 上午8:39

相关推荐