图像处理阈值分类_图像处理阈值化的阈值确定 - CSDN
  • 图像处理阈值是什么意思?

    万次阅读 2018-03-29 14:32:01
    图像处理中它的意思是颜色转换的临界点,该方法只用于二值化的图像中列如在自然中每一种颜色都有一个值,通常由RGB(即红、绿、蓝三原色)按比例混合就会得到各种不同的颜色。阈值处理图片是对颜色进行特殊处理的...
    的意思是界限,故阈值又叫临界值,是指一个效应能够产生的最低值或最高值。
    在图像处理中它的意思是颜色转换的临界点,该方法只用于二值化的图像中
    列如在自然中每一种颜色都有一个值,通常由RGB(即红、绿、蓝三原色)按比例混合就会得到各种不同的颜色。阈值处理图片是对颜色进行特殊处理的一种方法。
    详细说,阈值是一个转换临界点,不管你的图片是什么样的彩色,它最终都会把图片当黑白图片处理,也就是说你设定了一个阈值之后,它会以此值作标准,凡是比该值大的颜色就会转换成白色,低于该值的颜色就转换成黑色,所以最后的结果是,你得到一张黑白的图片。

    用阈值的作用:得到一张对比度不同的黑白图片

    阈值可以是最小值:某一性能特征不能低于该值。
    展开全文
  • [Python图像处理] 七.图像阈值化处理及算法对比

    万次阅读 多人点赞 2020-08-20 12:49:11
    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。...

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

    该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
    PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

    同时推荐作者的C++图像系列知识:
    [数字图像处理] 一.MFC详解显示BMP格式图片
    [数字图像处理] 二.MFC单文档分割窗口显示图片
    [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
    [数字图像处理] 四.MFC对话框绘制灰度直方图
    [数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
    [数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
    [数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    前文参考:
    [Python图像处理] 一.图像处理基础知识及OpenCV入门函数
    [Python图像处理] 二.OpenCV+Numpy库读取与修改像素
    [Python图像处理] 三.获取图像属性、兴趣ROI区域及通道处理
    [Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
    [Python图像处理] 五.图像融合、加法运算及图像类型转换
    [Python图像处理] 六.图像缩放、图像旋转、图像翻转与图像平移

    本篇文章主要讲解Python调用OpenCV实现图像阈值化处理操作,包括二进制阈值化、反二进制阈值化、截断阈值化、反阈值化为0、阈值化为0。全文均是基础知识,希望对您有所帮助。
    1.阈值化
    2.二进制阈值化
    3.反二进制阈值化
    4.截断阈值化
    5.反阈值化为0
    6.阈值化为0

    PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时部分参考网易云视频,推荐大家去学习。同时,本篇文章涉及到《计算机图形学》基础知识,请大家下来补充。

    PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

    五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

    一. 阈值化

    (注:该部分参考作者的论文《基于苗族服饰的图像锐化和边缘提取技术研究》)

    图像的二值化或阈值化(Binarization)旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值T,通过T将图像的像素划分为两类:大于T的像素群和小于T的像素群。
    灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如公式1所示:

    {Y=0gray<TY=255gray>=T\begin{cases} Y=0,gray<T\\ Y=255,gray>=T\\ \end{cases}
    当灰度Gray小于阈值T时,其像素设置为0,表示黑色;当灰度Gray大于或等于阈值T时,其Y值为255,表示白色。
    Python OpenCV中提供了阈值函数threshold()实现二值化处理,其公式及参数如下图所示:
    retval, dst = cv2.threshold(src, thresh, maxval, type)

    常用的方法如下表所示,其中函数中的参数Gray表示灰度图,参数127表示对像素值进行分类的阈值,参数255表示像素值高于阈值时应该被赋予的新像素值,最后一个参数对应不同的阈值处理方法。
    对应OpenCV提供的五张图如下所示,第一张为原图,后面依次为:二进制阈值化、反二进制阈值化、截断阈值化、反阈值化为0、阈值化为0。
    二值化处理广泛应用于各行各业,比如生物学中的细胞图分割、交通领域的车牌设别等。在文化应用领域中,通过二值化处理将所需民族文物图像转换为黑白两色图,从而为后面的图像识别提供更好的支撑作用。下图表示图像经过各种二值化处理算法后的结果,其中“BINARY”是最常见的黑白两色处理。


    二. 二进制阈值化

    该方法先要选定一个特定的阈值量,比如127。新的阈值产生规则如下:
    dst(x,y)={maxValifsrc(x,y)>thresh0otherwise dst(x,y) = \begin{cases} maxVal, if src(x,y)>thresh\\ 0,otherwise\\ \end{cases}
    (1) 大于等于127的像素点的灰度值设定为最大值(如8位灰度值最大为255)
    (2) 灰度值小于127的像素点的灰度值设定为0
    例如,163->255,86->0,102->0,201->255。

    关键字为 cv2.THRESH_BINARY,完整代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test.jpg')
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #二进制阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)
    print r
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出为两个返回值,r为127,b为处理结果(大于127设置为255,小于设置为0)。如下图所示:



    三. 反二进制阈值化

    该方法与二进制阈值化方法相似,先要选定一个特定的灰度值作为阈值,比如127。新的阈值产生规则如下:
    dst(x,y)={0ifsrc(x,y)>threshmaxValotherwise dst(x,y) = \begin{cases} 0, if src(x,y)>thresh\\ maxVal,otherwise\\ \end{cases}
    (1) 大于127的像素点的灰度值设定为0(以8位灰度图为例)
    (2) 小于该阈值的灰度值设定为255
    例如,163->0,86->255,102->255,201->0。

    关键字为 cv2.THRESH_BINARY_INV,完整代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test.jpg')
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #反二进制阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
    print r
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    该方法得到的结果正好与二进制阈值化方法相反,亮色元素反而处理为黑色,暗色处理为白色。

    四. 截断阈值化

    该方法需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变,比如127。新的阈值产生规则如下:
    dst(x,y)={thresholdifsrc(x,y)>threshsrc(x,y)otherwise dst(x,y) = \begin{cases} threshold, if src(x,y)>thresh\\ src(x,y),otherwise\\ \end{cases}
    (1) 大于等于127的像素点的灰度值设定为该阈值127
    (2) 小于该阈值的灰度值不改变
    例如,163->127,86->86,102->102,201->127。

    关键字为 cv2.THRESH_TRUNC,完整代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test.jpg')
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #截断阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TRUNC)
    print r
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示::

    该处理方法相当于把图像中比较亮(大于127,偏向于白色)的像素值处理为阈值。

    五. 反阈值化为0

    该方法先选定一个阈值,比如127,接着对图像的灰度值进行如下处理:
    dst(x,y)={0ifsrc(x,y)>threshsrc(x,y)otherwise dst(x,y) = \begin{cases} 0, if src(x,y)>thresh\\ src(x,y),otherwise\\ \end{cases}
    (1) 大于等于阈值127的像素点变为0
    (2) 小于该阈值的像素点值保持不变
    例如,163->0,86->86,102->102,201->0。

    关键字为 cv2.THRESH_TOZERO_INV,完整代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test.jpg')
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #反阈值化为0处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)
    print r
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:



    六. 阈值化为0

    该方法先选定一个阈值,比如127,接着对图像的灰度值进行如下处理:
    dst(x,y)={src(x,y)ifsrc(x,y)>thresh0otherwise dst(x,y) = \begin{cases} src(x,y), if src(x,y)>thresh\\ 0,otherwise\\ \end{cases}
    (1) 大于等于阈值127的像素点,值保持不变
    (2) 小于该阈值的像素点值设置为0
    例如,163->163,86->0,102->0,201->201。

    关键字为 cv2.THRESH_TOZERO,完整代码如下:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    
    #读取图片
    src = cv2.imread('test.jpg')
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #阈值化为0处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO)
    print r
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果如下图所示:

    该算法把比较亮的部分不变,比较暗的部分处理为0。

    完整五个算法的对比代码如下所示:

    #encoding:utf-8
    import cv2  
    import numpy as np  
    import matplotlib.pyplot as plt
    
    #读取图像
    img=cv2.imread('test.jpg')
    lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
    
    #阈值化处理
    ret,thresh1=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)  
    ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV)  
    ret,thresh3=cv2.threshold(GrayImage,127,255,cv2.THRESH_TRUNC)  
    ret,thresh4=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO)  
    ret,thresh5=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO_INV)
    
    #显示结果
    titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']  
    images = [GrayImage, thresh1, thresh2, thresh3, thresh4, thresh5]  
    for i in xrange(6):  
       plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')  
       plt.title(titles[i])  
       plt.xticks([]),plt.yticks([])  
    plt.show()
    

    输出结果如下图所示:

    希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。最近经历的事情太多,有喜有悲,关闭了朋友圈,希望通过不断学习和写文章来忘记烦劳,将忧郁转换为动力。哎,总感觉自己在感动这个世界,帮助所有人,而自己却…谁有关心秀璋?晚安。
    (By:Eastmount 2018-10-30 晚上10点 https://blog.csdn.net/Eastmount/)


    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    展开全文
  • 图像处理阈值分割

    千次阅读 2019-05-22 17:39:49
    全局阈值就是在整个图像中将灰度阈值设置成一个常数,全局阈值适合如下场景:图像背景的灰度值在整个图像中可合理的看作恒定,而且所有物体和背景都具有几乎相同的对比度,反应在直方图上就是 具有明显的双峰。...

    全局阈值

    全局阈值就是在整个图像中将灰度阈值设置成一个常数,全局阈值适合如下场景:图像背景的灰度值在整个图像中可合理的看作恒定,而且所有物体和背景都具有几乎相同的对比度,反应在直方图上就是 具有明显的双峰。在此种情况下,只要选择合适的阈值,使用固定的全局阈值往往会有比较好的效果。全局阈值选择的主要方法有:人工选择法、直方图选择法、迭代式阈值选择法、最大类间方差阈值(Otsu)。
    在OpenCV中图像的二值化分割采用的是 cv2.threshold(src, thresh, maxval, type, dst=None)

    • 第一个参数src: 原图像
    • 第二个参数thresh: 分类的阈值
    • 第三个参数 maxval:高于阈值时选取的新的值
    • 第四个参数maxval: 就是 上述介绍的几个方法选择参数
      常用的有:• cv2.THRESH_BINARY(黑白二值)
      • cv2.THRESH_BINARY_INV(黑白二值反转)
      • cv2.THRESH_TRUNC (得到的图像为多像素值)
      • cv2.THRESH_TOZERO
      • cv2.THRESH_TOZERO_INV
    • 返回值(2个):第一个 retVal: 得到的阈值,第二个 就是阈值化后的图像
    import cv2
    import numpy as np
    img = cv2.imread("sources/lena_1.tiff",0)
    from matplotlib import pyplot as plt
    
    ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV )
    #ret , thresh = cv2.threshold(img,127,255,cv2.THRESH_OTSU )
    cv2.imshow("1",thresh)
    cv2.waitKey(0)
    

    自适应阈值

    在很多情况下,背景的灰度值并不是常数,物体和背景的对比度在图像中是变化的,此时一个图像中某个区域效果良好的阈值在其他区域可能会效果很差。在这种情况下,需要把灰度阈值取为一个随图像中位置缓慢变化的函数值,也就是自适应阈值。
    自适应阈值主要的方法就是将图像进一步划分为子图像,并对不同的子图像使用不同的阈值进行分割。此方法的关键问题就是如何将图像进行细分和如何为得到的子图像估计阈值。
    自适应阈值的经典算法是: 分水岭算法,详情参考博文:https://blog.csdn.net/dcrmg/article/details/52498440
    OpenCV的自适应阈值函数为:
    cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)

    • 第一个参数src: 原图像
    • 第二个参数maxVal: 像素的最大值
    • 第三个参数 adaptiveMethod(有两种方法):
      cv2.ADAPTIVE_THRESH_MEAN_C:邻域内均值
      cv2.ADAPTIVE_THRESH_GAUSSIAN_C:邻域内像素点加权和,权重为一个高斯窗口
      第四个参数thresholdType:有 cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV两个
      第五个参数Block Size:规定的邻域大小
      第六个参数 C:设置阈值为 (均值 - C) 或者是 (加权值 - C)

    返回值: 只有一个,就是二值化后的图像

    import cv2
    import numpy as np
    img = cv2.imread("sources/lena_1.tiff",0)
    from matplotlib import pyplot as plt
    
    thresh = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,10)
    
    cv2.imshow("1",thresh)
    cv2.waitKey(0)
    

    - 显示效果
    ------ 全局阈值
    图1
    -----局部阈值自适应调整
    图2

    • 分析
      最后两个参数,是用来调整子图像大小(子图像边长只能为奇数) 以及 局部子图像阈值自适应调整。这两个参数用来改善二值化的图像的质量。当子图像的大小调整到原图像大小时,该方法退化为 全局阈值调整。
    展开全文
  • 数字图像处理(10): OpenCV 图像阈值化处理

    千次阅读 多人点赞 2019-07-02 13:30:35
    目录 1 什么是阈值化-threshold() 2 二进制阈值化 3 反二进制阈值化 4 截断阈值化 5 反阈值化为0 ...6 阈值化为0 ...1 什么是阈值化-threshold() ...通常会设定一个阈值,通过阈值图像的像素划分为两类:大于阈值的...

    目录

    1 什么是阈值化- threshold()

    2 二进制阈值化

    3 反二进制阈值化

    4 截断阈值化

    5 反阈值化为0

    6 阈值化为0

    7 小结

    参考资料


    1 什么是阈值化- threshold()

    图像的二值化或阈值化 (Binarization) 旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值 T,通过阈值 T 将图像的像素划分为两类:大于阈值 {\color{Red} T} 的像素群和小于阈值 {\color{Red} T} 的像素群。

    灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。二值化处理可以将图像中的像素划分为两类颜色,常用的二值化算法如下所示:

                                                                                \left\{ {\begin{array}{*{20}{c}} {Y = 0}&, \\ {Y = 255}&, \end{array}\begin{array}{*{20}{c}} {gray < T} \\ {gray > = T} \end{array}} \right.

    其中,当灰度Gray小于阈值T时,其像素设置为0,表示黑色;

               当灰度Gray大于或等于阈值T时,其Y值为255,表示白色。

    Python OpenCV中提供了阈值函数 threshold() 实现二值化处理,其函数形式及参数如下图所示:

    retval, dst = cv2.threshold(src, thresh, maxval, type)

    其中,参数:

    retval:阈值        

    dst: 处理结果

    src,:原图像

    thresh:阈值

    maxval:最大值

    type:类

     

    常用的方法如下表所示,其中函数中的参数Gray表示灰度图,参数127表示对像素值进行分类的阈值,参数255表示像素值高于阈值时应该被赋予的新像素值,最后一个参数对应不同的阈值处理方法。

     

    对应OpenCV提供的五张图如下所示,第一张为原图,后面依次为:

    二进制阈值化反二进制阈值化截断阈值化反阈值化为0 和 阈值化为0

     

    二值化处理广泛应用于各行各业,比如生物学中的细胞图分割、交通领域的车牌设别等。在文化应用领域中,通过二值化处理将所需民族文物图像转换为黑白两色图,从而为后面的图像识别提供更好的支撑作用。下图表示图像经过各种二值化处理算法后的结果,其中“BINARY”是最常见的黑白两色处理。下面将依次对5种阈值化处理方法进行介绍以及实验对比。


     

    2 二进制阈值化

    二进制阈值化方法先要选定一个特定的阈值量,比如127。新的阈值产生规则如下:

                                                                 dst(x,y) = \left\{ {\begin{array}{*{20}{c}} {\max Val}&,\\ 0&, \end{array}\begin{array}{*{20}{c}} {if{\rm{ }}src(x,y) > thresh}\\ {otherwise} \end{array}} \right.

    (1) 大于等于127的像素点的灰度值设定为最大值(如8位灰度值最大为255);

    (2) 灰度值小于127的像素点的灰度值设定为0 ;

    例如,163->255,86->0,102->0,201->255

    使用关键字为:cv2.THRESH_BINARY

    例如:r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)

     

    代码如下:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #二进制阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY)
    print (r)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:(R, B两个通道均使用了阈值处理


     

    3 反二进制阈值化

    反二进制阈值化方法与二进制阈值化方法相似,先要选定一个特定的灰度值作为阈值,比如127。新的阈值产生规则如下公式所示:

                                                               dst(x,y) = \left\{ {\begin{array}{*{20}{c}} 0&,\\ {\max Val}&, \end{array}\begin{array}{*{20}{c}} {if{\rm{ }}src(x,y) > thresh}\\ {otherwise} \end{array}} \right.

    (1) 大于127的像素点的灰度值设定为0(以8位灰度图为例);

    (2) 小于该阈值的灰度值设定为255;

    例如,163->0,86->255,102->255,201->0。

    使用关键字为: cv2.THRESH_BINARY_INV

    例如:r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)

     

    代码如下:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #反二进制阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_BINARY_INV)
    print (r)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

     

    运行结果如下图所示:


     

    4 截断阈值化

    截断阈值化方法需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变,比如127。新的阈值产生规则如下:

                                                              dst(x,y) = \left\{ {\begin{array}{*{20}{c}} {threshold}&,\\ {src(x,y)}&, \end{array}\begin{array}{*{20}{c}} {if{\rm{ }}src(x,y) > thresh}\\ {otherwise} \end{array}} \right.

    (1) 大于等于127的像素点的灰度值设定为该阈值127;

    (2) 小于该阈值的灰度值不改变;

    例如,163->127,86->86,102->102,201->127。

    使用关键字为: cv2.THRESH_TRUNC

    例如:r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TRUNC)

     

    代码如下:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #截断阈值化处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TRUNC)
    print (r)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:[ 该处理方法相当于把图像中比较亮(大于127,偏向于白色)的像素值处理为阈值。]


     

    5 反阈值化为0

    反阈值化为0 方法先选定一个阈值,比如127,接着对图像的灰度值进行如下处理:

                                                               dst(x,y) = \left\{ {\begin{array}{*{20}{c}} 0&,\\ {src(x,y)}&, \end{array}\begin{array}{*{20}{c}} {if{\rm{ }}src(x,y) > thresh}\\ {otherwise} \end{array}} \right.

    (1) 大于等于阈值127的像素点变为0 ;

    (2) 小于该阈值的像素点值保持不变;

    例如,163->0,86->86,102->102,201->0。

    使用关键字为: cv2.THRESH_TOZERO_INV 

    例如:r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)

     

    代码如下:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #反阈值化为0处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)
    print (r)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:


     

    6 阈值化为0

    阈值化为0 方法先选定一个阈值,比如127,接着对图像的灰度值进行如下处理:

                                                             dst(x,y) = \left\{ {\begin{array}{*{20}{c}} {src(x,y)}&,\\ 0&, \end{array}\begin{array}{*{20}{c}} {if{\rm{ }}src(x,y) > thresh}\\ {otherwise} \end{array}} \right.

     

    (1) 大于等于阈值127的像素点,值保持不变;

    (2) 小于该阈值的像素点值设置为0 ;

    例如,163->163,86->0,102->0,201->201。

    使用关键字为: cv2.THRESH_TOZERO

    例如:r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO)

     

    代码如下:

    #encoding:utf-8
    import cv2
    import numpy as np
    
    #读取图片
    src = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    
    #灰度图像处理
    GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
    
    #阈值化为0处理
    r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO)
    print (r)
    
    #显示图像
    cv2.imshow("src", src)
    cv2.imshow("result", b)
    
    #等待显示
    cv2.waitKey(0)
    cv2.destroyAllWindows()

     

    运行结果如下图所示:(该方法把比较亮的部分不变,比较暗的部分处理为0。)


     

    7 小结

    把上面提及的五种阈值处理方法(二进制阈值化反二进制阈值化截断阈值化反阈值化为0 和 阈值化为0)放在一起进行对比

    代码如下所示:(注意一个窗口多张图像的用法

    #encoding:utf-8
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    
    #读取图像
    img = cv2.imread("zxp.jpg", cv2.IMREAD_UNCHANGED)
    lenna_img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    GrayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    #阈值化处理
    ret,thresh1=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY)
    ret,thresh2=cv2.threshold(GrayImage,127,255,cv2.THRESH_BINARY_INV)
    ret,thresh3=cv2.threshold(GrayImage,127,255,cv2.THRESH_TRUNC)
    ret,thresh4=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO)
    ret,thresh5=cv2.threshold(GrayImage,127,255,cv2.THRESH_TOZERO_INV)
    
    #显示结果
    titles = ['Gray Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
    images = [GrayImage, thresh1, thresh2, thresh3, thresh4, thresh5]
    for i in range(6):
       plt.subplot(2,3,i+1),plt.imshow(images[i],'gray')
       plt.title(titles[i])
       plt.xticks([]),plt.yticks([])
    plt.show()
    

     

    运行结果如下所示:(注意一个窗口多张图像的用法


     

    参考资料

    [1] https://blog.csdn.net/Eastmount/article/details/83548652

    [2] Python+OpenCV图像处理

    展开全文
  • 图像处理基本算法 动态阈值分割

    万次阅读 多人点赞 2012-02-11 16:18:32
    图像处理时,受外界光线的干扰一般比较大,假如在阈值分割时采用固 定阈值,那么在环境改变时分割效果受影响极大,那么为了避免此影响就 必须采用动态阈值,自动求出合适的阈值进行分割。 本文的介绍几...
  • 基本的全局阈值处理图像的前景和背景相关的只方图之间存在一个相当清晰的波谷时,这个算法效果很好。这部分算法比较简单,由于时间关系,并没有写相关代码算法步骤:一、为全局阈值T选择一个初始的估计值(一般选...
  • 图像阈值处理(Python)

    千次阅读 2017-03-21 22:35:34
    图像阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。当然阈值越多是越复杂的。下面将介绍opencv下的三种阈值方法。...
  • Matlab实现图像阈值分割

    万次阅读 多人点赞 2019-08-03 11:32:54
    使用matlab实现阈值分割,实现两种方法,一是人工选择阈值进行分割,而是自动选择阈值进行分割。操作步骤 1、 打开Matlab内容自带的coins.png图像。 2、 观察它的直方图。 3、 人工选定一个阈值,并进行分割。 4...
  • [matlab图像处理] 阈值分割

    万次阅读 2014-03-11 16:04:48
    %迭代式阈值分割 otsu阈值分割 二值化 close all;%关闭所有窗口 clear;%清除变量的状态数据 clc;%清除命令行 I=imread('rice.png'); subplot(2,2,1); imshow(I); title('1 rice的原图'); %迭代式阈值分割 zmax=...
  • python+OpenCV图像处理(五)图像的阈值分割

    万次阅读 多人点赞 2018-07-10 22:37:51
    图像阈值处理 一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最...
  • 基于Otsu算法的图像自适应阈值分割

    万次阅读 多人点赞 2020-04-17 03:09:02
    图像处理实践中,将灰度图转化为二值图是非常常见的一种预处理手段。在Matlab中,可以使用函数BW = im2bw(I, level)来将一幅灰度图 I,转化为二值图。其中,参数level是一个介于0~1之间的值,也就是用于分割图像的...
  • 图像的简单阈值处理

    2019-11-18 16:54:23
    图像处理的领域中,图像的阈值处理一般使得图像的像素值更单一、图像更简单。前提输入进来的图片是灰度图,那么在之后的处理当中,将像素点分开就会更加明显。可以将整幅图像分成了非黑即白的二值图像了。 Opencv...
  • Python下opencv使用笔记(四)(图像阈值处理

    万次阅读 多人点赞 2015-07-09 09:04:45
    图像阈值处理一般使得图像的像素值更单一、图像更简单。阈值可以分为全局性质的阈值,也可以分为局部性质的阈值,可以是单阈值的也可以是多阈值的。当然阈值越多是越复杂的。下面将介绍opencv下的三种阈值方法。 ...
  • 图像阈值分割(Optimum Thresholding)

    万次阅读 2015-02-05 13:44:34
    图像分割是图像处理中的重要问题,也是计算机视觉研究中的一个经典难题。计算机视觉中的图像理解包括目标检测、特征提取和目标识别等,都依赖于分割的质量。阈值法是一种简单有效的分割方法,其最大特点就是计算简单...
  • 图像分割阈值选取技术综述

    万次阅读 2006-02-27 09:39:00
    图像分割阈值选取技术综述中科院成都计算所 刘平 2004-2-26摘要 图像分割是图像处理与计算机视觉领域低层次视觉中最为基础和重要的领域之一,它是对图像进行视觉分析和模式识别的基本前提.阈值法是一种传统的...
  • OpenCV-Python Tutorials,包括对原文档种错误代码的纠正3.3 图像阈值3.3.1 目标:在这章,会学到简单的阈值、自适应阈值、大津阈值等学会这些函数:cv2.threshold()、cv2.adaptiveThreshold()等3.3.2 简单的阈值...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 目录五、图像阈值和二...
  • 图像阈值分割---基本的全局阈值

    万次阅读 2013-01-24 14:21:43
    由于阈值处理直观、实现简单且计算速度快,因此图像阈值处理图像分割中处于核心地位,下面我会为大家介绍阈值处理的方法,并用OpenCV给出实现的代码。 第一种:图像阈值分割---基本的全局阈值 1. 处理流程:  ...
  • 灰度图像阈值化分割常见方法总结及VC实现

    万次阅读 多人点赞 2011-11-11 23:24:17
    图像处理领域,二值图像运算量小,并且能够体现图像的关键特征,因此被广泛使用。将灰度图像变为二值图像的常用方法是选定阈值,然后将待处理图像的每个像素点进行单点处理,即将其灰度值与所设置的门限进行比对,...
  • 使用积分图像的自适应阈值处理

    千次阅读 2018-10-11 22:47:05
    论文:Adaptive Thresholding Using the Integral Image 地址:... 应用:matlab二值化函数 T = adaptthresh(I) 这应该是adapthre...
1 2 3 4 5 ... 20
收藏数 22,592
精华内容 9,036
关键字:

图像处理阈值分类