精华内容
下载资源
问答
  • 1、小波阈值去噪的改进传统的小波阈值图像去噪方法可以去除图像的部分噪声,有较好的效果,但是由于阈值函数和阈值选取方式自身存在的问题,设置的阈值并不能完全去除图像噪声,还会由于阈值函数的问题而使去噪后的...

    1、小波阈值去噪的改进

    传统的小波阈值图像去噪方法可以去除图像的部分噪声,有较好的效果,但是由于阈值函数和阈值选取方式自身存在的问题,设置的阈值并不能完全去除图像噪声,还会由于阈值函数的问题而使去噪后的图像视觉效果不佳,这就需要对目前的阈值函数和阈值选取方式进行改进,得到可以更好地去除图像噪声的小波阈值去噪方法。

    1.1、阈值函数的改进

    前面提到的两种阈值函数,软阈值函数和硬阈值函数虽然能够去除图像的得到了较广泛的应用,但是由于自身存在缺点,还是会影响图像去噪的效果。硬阈值函数的缺点是在阈值点不连续;软阈值函数的缺点是原系数和小波分解系数存着恒定的偏差。这两种阈值函数不能完全地展示出分解后小波系数的能量分布,这就限制了它的进一步应用。所以,需要寻求一种新的阈值函数使它能够在继承软阈值,硬阈值的优点的同时克服它们的缺点。这就需要阈值函数在其阈值点处连续,同时还具有高阶可导的性质,这样既能实现阈值函数阈值选取的功能又能完好的体现出分解后系数的能量分布。根据以上对软阈值和硬阈值的分析和指数函数高阶可导的特点,现在提出一种新的阈值函数,如下所示:

    219402d1e79e75af53c6661ea3fbaa36.png

    式中,λ为阈值。两个参数p,q在阈值函数中发挥着各自的作用,共同决定着阈值处理过程与结果,其中p∈[0,1],q≥0。该阈值函数保留了软阈值函数在小波域内具有连续性的优点,而且在|x|≥λ时具有高阶导函数。随着p,q在各自固定的取值区间内的波动,该阈值函数发挥着不同的作用。当p=0时,无论q取什么值,此阈值函数就成为了硬阈值函数;当p∈(0,1]且q=0时,此阈值函数就成为了软阈值函数;当p∈(0,1]且q→∞时,此阈值函数变成了一种类似软阈值的阈值函数,在该函数中,参数p可以调节阈值函数对小波系数的压缩程度,弥补了传统软阈值函数在这方面的不足。

    由此可见,通过改变p,q的取值可以决定此阈值函数对小波系数的作用。其中,q值的改变主要确定阈值函数的趋向,是成为软阈值还是硬阈值,而p值的变化主要决定阈值函数对小波系数的作用程度。通过p,q这两个参数的共同作用,此阈值函数就变成了软阈值,硬阈值的一种推广函数,在保存了两种阈值函数优点的同时,也克服了它们在处理小波系数时的一些缺点。

    新提出的阈值函数不仅在小波域内具有连续性,而且在|x|≥λ时具有高阶可导的性质,这样该阈值函数不仅继承了软阈值函数具有连续性的优点,而且还克服了软阈值在处理过程中小波系数与原系数之间存在固有偏差的缺点,同时也解决了对大于阈值的系数进行定值压缩与噪声随着小波系数增大而减少的事实不符合的问题,并通过两个参数的调节使它同时具备了硬阈值函数的性能,也就是说此阈值函数同时具备了软阈值和硬阈值的优点,使用起来更加方便、灵活,去噪效果更好。

    1.2、新的阈值选取方式

    小波阈值去噪法另一个重要的因素就是阈值的选取,阈值主要由噪声方差和子带系数的能量共同决定,一般情况下,噪声方差需要从观测数据中得出。若阈值过小,则噪声去除不完全,去噪后的图像仍有噪声残留;若阈值选取过大,会有部分信号被当作噪声被滤除,造成信号丢失,引起偏差。噪声的小波系数随着尺度的增大而减小,所以对信号进行去噪时,不同分解层阈值的选取也应该不同,并且阈值应该随着分解尺度的增加而减少。传统的阈值选取方式,包括全局阈值和局部适应阈值并没有随着分解尺度的变化而有所改变,所以针对以上要求和传统阈值选取方式在这方面的不足之处,现在提出一种新的,易实现的阈值选取方式:

    6a7a341b1b46ddf6c09470cb92c0b518.png

    式中,α为高斯白噪声的标准差,N为图像尺度,j为分解尺度。此阈值选取方式是在统一阈值基础上进行改进的,在保留了传统统一阈值中标准差α和图像尺度N在阈值上所做的贡献的同时在分母上添加了分解尺度j,使阈值随着分解尺度而改变,分解尺度越大阈值就会相应的减少,这样就比较符合经过小波分解后不同分解层的系数在对信号和噪声的比例分布上有所不同的事实。新设定的阈值在保留了原来统一阈值在阈值处理中发挥的功能的基础上,通过新增加的分解尺度可以针对小波分解中不同的分解层对各分解层的小波系数做相应不同的处理,这样可以增加阈值的实用性,减少小波系数阈值误断引起的偏差。

    斯白噪声的标准差α的选取也有多种方式:可以利用鲁棒中值估计法来估计,

    α=(median(|fi|)/0.6745)^(0.5)

    其中,fi是最低分解尺度的频带;也可以利用小波分解系数中对角细节系数的标准差作为噪声标准差α的估计值。本文采取第二种方法,用对角系数的标准差αD作为α的估计值。这样一来,最后的阈值公式为:

    f006efb05a96d6ff0bde418010c1dc6a.png

    公式中,αD作为α的估计值,可以很容易地在小波分解图像信号之后由分解出的对角系数计算出来。

    接下来我们从小波阈值函数方面来分析小波阈值去噪的改进方法。

    2、小波阈值函数的改进

    硬、软阈值方法在去噪方面取得了较好的效果,但它们存在缺点。式(3)虽然解决了|w^j,k-wj,k|的误差问题,但存在间断点±λ,在图像重建时会产生一些附加震荡,而且比较容易出现Pseudo-Gibbs现象等视觉失真。同样,式(4)在±λ处连续性好,但|w^j,k-wj,k|存在恒定的误差,这样会使图像的高频信息产生丢失等失真的现象,且式(4)存在高阶求导的困难,不利于进一步用数学工具对它处理。硬软折中阈值函数对式(3)(4)进行了改进,但依然存在恒定偏差问题。

    为了更好地解决以上方法所带来的问题,分别提出了如下的改进的阈值函数:

    3fe62332f8e9e8983ca568ae852b9ed8.png

    式(5)很好地解决了含噪图像的小波系数与估计小波系数恒等的误差问题,但它没有调节因子,显然不够灵活,而且连续性差;式(6)虽然解决了连续性问题,但含噪图像的小波系数与估计小波系数的恒定偏差还是没有得到很好的解决。为了能够有效解决上述问题,本文提出了新的函数:

    fdac962e103f256114bd6d350a92e17e.png

    图1的横坐标为对fj,k经过小波变换得到的原始的小波系数;纵坐标为对小波系数进行阈值处理后的得到的估计的小波系数。λ为门限值;根据式(7)的函数进行绘图。图1中,λ=5,原始小波系数取值范围为-20~20。

    17d91cc58d208915285405a24ddeb493.png

    图1   α=1,n=3时改进阈值函数

    2.1、阈值函数分析

    从数学的角度对式(7)进行如下分析。

    1)函数的连续性。

    703d04f9dfc1f43832b7953262472719.png

    综上所述:新阈值函数在±λ处连续。

    2)函数的渐近性。

    9a228b464eeef89b0296a62f165ea610.png

    3479b9a5239286ed6d879376dd2304cb.png

    综上所述:函数式(7)是以w^j,k=wj,k为渐近线的,也就是说,新阈值函数以w^j,k=wj,k为渐近线。

    3)阈值函数的偏差性。

    41303717a2187f4ae283e7756d66b349.png

    随着wj,k→∞,w^j,k逐渐接近wj,k,从而克服了w^j,k与wj,k之间具有偏差的问题。

    4)函数的高阶可导性。

    当|wj,k|≥λ时,新阈值函数满足高阶可导,所以便于进行各种数学处理。

    5)阈值可变因子α与n影响分析。

    当α=0,n=1时,新阈值函数为式(5);当α=0,n→0时,新阈值函数为软阈值函数,当n→∞时新阈值函数为硬阈值函数;

    当α→∞时新阈值函数就变成为硬阈值函数;因此与式(5)和式(6)相比,新阈值函数不仅具有整体连续性的优点,而且根据实际应用调节非常灵活。

    2.2、改进的阈值函数去噪算法步骤

    第1步选择合适的小波基函数,小波基一般根据具体噪声图像的特点进行选择。然后对带噪声图像式(1)中fj,k进行多层次正交小波变换,得到一组小波分解系数wj,k,其中:wj,1∈{LHj}(j层水平方向小波系数);wj,2∈{HLj}(j层垂直方向小波系数);wj,3∈{HHj}(j层对角线方向小波系数);(j=1,2,…,l,l表示小波分解的层数)。

    第2步对式(1)中噪声nj,k方差δ进行估计,噪声方差δ=median(w1,3/c),其中c是常数,一般取0.6745。然后在求出δ的基础上,根据式(2)求出门限阈值λ的值。

    第3步以λ为门限,分别根据式(7)对LHj,HLj,HHj系数进行阈值处理,得到估计的小波系数w^j,k。

    第4步根据所得w^j,k小波系数以及其他没有进行阈值处理的低频部分的小波系数利用小波基函数进行小波重新构造,从而得到去噪后的图像f^j,k即f^j,k就是所要求的图像。

    为了证明改进阈值函数去噪的有效性,使用Matlab软件对加0.01的高斯白噪的Lena和Cameraman图像分别用经典的软、硬阈值函数、硬软折中阈值函数以及改进的阈值函数进行仿真实验。去噪效果如图2所示。

    af9cde823746db60aafab6869ad3acd9.png

    图2  对Lena图像不同方法降噪结果

    展开全文
  • 阈值分割

    2021-02-07 10:03:59
    阈值分割 简介: 图像分割:1.基于阈值的分割方法,2.基于区域的分割方法3.基于边缘的分割方法 阈值分割适合于那些前景与背景有较强对比度的图,如果不明显可以增大对比度(不知道怎么弄) 方法概述: 全局阈值分割 ...

    阈值分割

    简介:
    图像分割:1.基于阈值的分割方法,2.基于区域的分割方法3.基于边缘的分割方法
    阈值分割适合于那些前景与背景有较强对比度的图,如果不明显可以增大对比度(不知道怎么弄)

    方法概述:

    全局阈值分割

    全局指对整个图像进行,阈值分割指给定一个阈值,大于阈值就放大为255,不大于就变为零,或者可以反过来操作
    这里介绍一下python中的一个语法糖:

    import numpy as np
    import cv2 as cv
    # src=np.array([[[123,144,156],[222,32,67]],[[123,144,156],[222,32,67]]],dtype=np.uint8)
    src=cv.imread(r'C:\Users\19583\Desktop\3.png',cv.IMREAD_GRAYSCALE)
    src[src>180]=255
    src[src<=180]=0#这个语法糖爱了
    cv.imshow('1',src)
    cv.waitKey(0)
    

    在这里插入图片描述
    在这里插入图片描述

    上面这个写法对于所有类型的矩阵都行,直接遍历
    然后opencv也提供了现成的函数threshold:
    在这里插入图片描述
    注意返回值,第一个是阈值,第二个才是矩阵

    import numpy as np
    import cv2 as cv
    # src=np.array([[[123,144,156],[222,32,67]],[[123,144,156],[222,32,67]]],dtype=np.uint8)
    src=cv.imread(r'C:\Users\19583\Desktop\3.png',cv.IMREAD_COLOR)
    a,gj1=cv.threshold(src,100,255,cv.THRESH_BINARY)
    a,gj2=cv.threshold(src,100,255,cv.THRESH_BINARY_INV)
    a,gj3=cv.threshold(src,100,255,cv.THRESH_MASK)
    #a,gj4=cv.threshold(src,100,255,cv.THRESH_OTSU)
    a,gj5=cv.threshold(src,100,255,cv.THRESH_TOZERO)
    a,gj6=cv.threshold(src,100,255,cv.THRESH_TOZERO_INV)
    #a,gj7=cv.threshold(src,100,255,cv.THRESH_TRIANGLE)
    #a,gj8=cv.threshold(src,100,255,cv.THRESH_TRUNC)
    cv.imshow('1',gj1)
    cv.imshow('2',gj2)
    cv.imshow('3',gj3)
    #cv.imshow('4',gj4)
    cv.imshow('5',gj5)
    cv.imshow('6',gj6)
    #cv.imshow('7',gj7)
    #cv.imshow('8',gj8)
    cv.waitKey(0)
    

    _INV是反过来
    THRESH_BINARY模式:大于阈值取max,小于等于阈值取0

    src = np.array([[123,234,68],[33,51,17],[48,98,234],
                        [129,89,27],[45,167,134]],np.uint8)
    #手动设置阈值
    the = 150
    maxval = 255
    dst = cv.threshold(src,the,maxval,cv.THRESH_BINARY)
    # Otsu 阈值处理
    otsuThe = 0
    otsuThe,dst_Otsu = cv.threshold(src,otsuThe,maxval,cv.THRESH_OTSU)#先用otsh得到阈值再用binary(默认是这个)
    print(otsuThe,dst_Otsu)
    # TRIANGLE 阈值处理
    triThe = 0
    triThe,dst_tri = cv.threshold(src,triThe,maxval,cv.THRESH_TRIANGLE+cv.THRESH_BINARY_INV)#先用training得到阈值再用binary_INV
    print(triThe,dst_tri)
    

    98.0 [[255 255 0]
    [ 0 0 0]
    [ 0 0 255]
    [255 0 0]
    [ 0 255 255]]
    232.0 [[255 0 255]
    [255 255 255]
    [255 255 0]
    [255 255 255]
    [255 255 255]]

    还要说明一点,otsu,training要求,类型为uint8
    其他模式不讲了

    局部阈值分割

    在这里插入图片描述
    不同点的阈值不一样,关键在于各点阈值的计算

    直方图技术法

    我们的目的是找到下图的位置:
    在这里插入图片描述
    但是实际情况有时并不会像上面这样,比如可能两个波峰之间会有好几个波谷,而且他们都是最小值,一种思路是对直方图进行高斯平滑处理,但是这样要调好参数使之只有一个波谷,需要手工调,不好,下面介绍一种自动的方法:
    思路就是先找到最高的峰,这个很容易取频数最大的灰度值就行了,然后找第二个峰,怎么找?先对原直方图进行量化(不影响原直方图),这个量化与离第一个峰的距离和该点的频数有关(具体的在代码中给出),然后截取两个波峰之间的区域,找出中间频数最低的那个灰度值,如果有多个波峰,就取最左边的那个。这个就是分割的阈值,最好是处理前看一下直方图的形状,有些图压根分不开前景和背景。

    python

    import numpy as np
    import cv2 as cv
    def calcGrayHist(img):#获得直方图
        rows,cols=img.shape
        grayhist=np.zeros((256,1),dtype=np.float32)
        for r in range(rows):
            for c in range(cols):
                grayhist[img[r][c]]+=1
        return grayhist
    src=cv.imread(r'C:\Users\19583\Desktop\4.jpg',cv.IMREAD_GRAYSCALE)
    src=cv.resize(src,(500,500))
    #print(calcGrayHist(src))
    def threshTowPeaks(img):
        histgram=calcGrayHist(img)
        maxloc=np.where(histgram==max(histgram))
        print(maxloc)
        firstpeak=maxloc[0][0]#取出最大值的灰度值,第一个峰
        print(firstpeak)
        measuredists=np.zeros(256,np.float32)
        for k in range(256):
            measuredists[k]=pow(k-firstpeak,2)*histgram[k]#用到第一个峰的的距离和该点灰度值来量化
        print(measuredists)
        maxloc1=np.where(measuredists==max(measuredists))
        secondpeak=maxloc1[0][0]#第二个峰
        print(secondpeak)
        #thresh = 0
        #根据第二个峰与第一个峰的位置关系分类
        if firstpeak > secondpeak:
            temp = histgram[int(secondpeak):int(firstpeak)]#取出之间的区域
            minLoc = np.where(temp == np.min(temp))#找到最小值对应的灰度值(截取的从零开始记,所以这个值是相对的)
            thresh = secondpeak + minLoc[0][0] + 1#找到最小值对应的灰度值
        else:
            temp = histgram[int(firstpeak):int(secondpeak)]
            minLoc = np.where(temp == np.min(temp))
            thresh = firstpeak + minLoc[0][0] + 1
        threhimg=img.copy()
        print(thresh)
        threhimg[threhimg>thresh]=255
        threhimg[threhimg <= thresh] = 0
        return thresh,threhimg/255#返回阈值和处理好的图
    
    a,dst=threshTowPeaks(src)
    cv.imshow('src',src)
    cv.imshow('dst',dst)
    cv.waitKey(0)
    

    (array([11], dtype=int64), array([0], dtype=int64))
    11
    [0.0000000e+00 1.4000000e+03 4.9410000e+03 1.5680000e+04 2.5333000e+04
    2.9412000e+04 2.9925000e+04 2.4544000e+04 1.6974000e+04 7.6680000e+03
    1.9890000e+03 0.0000000e+00 1.8450000e+03 6.4960000e+03 1.1169000e+04
    1.9136000e+04 3.4175000e+04 5.2416000e+04 7.0805000e+04 9.5872000e+04
    1.1161800e+05 1.3160000e+05 1.4144900e+05 1.5696000e+05 1.6832400e+05
    1.7816400e+05 1.9845000e+05 2.1452800e+05 2.4507200e+05 2.7734400e+05
    3.1190400e+05 3.2840000e+05 3.2854500e+05 3.4218800e+05 3.8669900e+05
    3.9225600e+05 4.5187500e+05 4.8536800e+05 5.1030000e+05 5.8564800e+05
    5.8197200e+05 5.5170000e+05 5.8044400e+05 7.1168000e+05 6.8280300e+05
    7.6527200e+05 9.2487500e+05 1.0108800e+06 1.0130600e+06 1.1032160e+06
    1.0829520e+06 1.2112000e+06 1.1918290e+06 1.1818800e+06 1.2000010e+06
    1.2796960e+06 1.2048750e+06 1.3732840e+06 1.5153740e+06 1.6773120e+06
    2.0072360e+06 2.0975000e+06 2.2134510e+06 2.5255360e+06 2.7387750e+06
    2.9130840e+06 3.2004500e+06 3.5091840e+06 3.8208240e+06 4.0401640e+06
    4.0762510e+06 4.2372000e+06 4.5284570e+06 4.8511280e+06 4.6794510e+06
    4.4236800e+06 4.3559750e+06 4.2688800e+06 4.2241490e+06 4.5823840e+06
    4.6467360e+06 4.6991000e+06 5.4291570e+06 5.9823360e+06 6.5919730e+06
    7.0640400e+06 7.7568750e+06 8.7737440e+06 9.4864000e+06 9.8013240e+06
    1.0285168e+07 1.0758400e+07 1.1849166e+07 1.1787172e+07 1.2606870e+07
    1.2721968e+07 1.2911075e+07 1.3712184e+07 1.4509773e+07 1.5023360e+07
    1.4693455e+07 1.5681600e+07 1.5816710e+07 1.5057456e+07 1.5395220e+07
    1.5330460e+07 1.5369575e+07 1.5879168e+07 1.6955018e+07 1.7316012e+07
    1.7524188e+07 1.7780000e+07 1.7198886e+07 1.7405892e+07 1.6794048e+07
    1.7381312e+07 1.6250850e+07 1.5752872e+07 1.5055435e+07 1.4323392e+07
    1.2475050e+07 1.1168300e+07 9.7212690e+06 7.9027200e+06 7.4187890e+06
    7.6676400e+06 6.9960250e+06 7.3469760e+06 7.7069070e+06 8.3822480e+06
    9.9693440e+06 1.1203200e+07 1.0702571e+07 1.1788128e+07 1.2012426e+07
    1.2823584e+07 1.4265625e+07 1.4590044e+07 1.3854811e+07 1.5024128e+07
    1.6191693e+07 1.5801500e+07 1.7452736e+07 1.8504288e+07 2.1828226e+07
    2.3468492e+07 2.4038776e+07 2.8058432e+07 2.7684276e+07 2.6871084e+07
    2.7686992e+07 2.8341600e+07 2.8270782e+07 3.0205672e+07 3.1286970e+07
    3.2514048e+07 3.4859448e+07 3.3935072e+07 3.1505922e+07 3.2001744e+07
    3.2191450e+07 2.9205000e+07 3.1465380e+07 3.2715264e+07 3.0642380e+07
    3.1067960e+07 3.1640924e+07 3.2147856e+07 3.3818428e+07 3.6347584e+07
    3.7668688e+07 3.6121600e+07 3.6626372e+07 3.6269208e+07 3.7807688e+07
    3.8326800e+07 3.9775724e+07 3.8302840e+07 3.6925036e+07 3.5534016e+07
    3.8100376e+07 3.7916800e+07 3.7984060e+07 3.7275840e+07 3.7351392e+07
    3.7481688e+07 3.5341248e+07 3.8781952e+07 3.7939420e+07 3.7260384e+07
    3.7263684e+07 3.6028800e+07 3.9509768e+07 3.7628864e+07 4.0890068e+07
    4.0356352e+07 4.0488176e+07 3.8263176e+07 3.6297824e+07 3.3930240e+07
    3.3399136e+07 3.2309500e+07 3.0315712e+07 2.9048832e+07 2.5850806e+07
    2.7060284e+07 2.3347350e+07 2.5008816e+07 2.4449670e+07 2.4267276e+07
    2.6017856e+07 2.5000000e+07 2.2907368e+07 1.8606624e+07 2.0975380e+07
    2.0932848e+07 2.0172000e+07 1.6719784e+07 1.5382791e+07 1.3498368e+07
    1.1750189e+07 1.1113200e+07 1.0373393e+07 9.5281280e+06 9.7543350e+06
    7.9685040e+06 5.9630250e+06 4.8055680e+06 3.5316750e+06 8.5543200e+05
    1.4388300e+06 8.7120000e+05 8.3029700e+05 7.3926000e+05 6.4647700e+05
    7.0246400e+05 9.1125000e+05 8.6829200e+05 1.0305800e+06 1.0396800e+06
    9.9637900e+05 5.8190000e+05 7.4705400e+05 1.1303040e+06 9.2291300e+05
    1.1498760e+06 1.2149500e+06 1.5594880e+06 1.0672110e+06 1.1895240e+06
    1.7707510e+06 1.6704000e+06 2.0909160e+06 5.0950680e+06 8.0897130e+06
    5.3463328e+07]
    255
    242

    在这里插入图片描述

    熵算法

    在这里插入图片描述

    python实现

    import cv2 as cv
    import numpy as np
    import math
    src=cv.imread(r'C:\Users\19583\Desktop\4.jpg',cv.IMREAD_GRAYSCALE)
    src=cv.resize(src,(500,500))
    def threshentroy(img):
        rows,cols=img.shape
        #获得灰度直方图
        threshgram=np.ones(256,dtype=np.float32)#这里选一防止后面log真值为0,差个1应该没关系吧
        for r in range(rows):
            for c in range(cols):
                threshgram[img[r][c]]+=1
        threshentroygram=np.zeros(256,dtype=np.float32)
        threshgram/=np.sum(threshgram)
        for i in range(1,256,1):
            #重新归一化
            H=threshgram[0:i+1].copy()
            T=threshgram[i+1:].copy()
            #print(np.sum(H))
            if np.sum(H)==0:
                H=0
            else:
                H/=np.sum(H)
            if np.sum(T)==0:
                T=0
            else:
                T/=np.sum(T)
            #定义两个变量存前后两个熵的值
            f1=0
            f2=0
            #计算两部分的值
            for j in range(i+1):
                f1+=-H[j]*math.log(H[j],2.71)
            for j in range(255-i):
                f2+=-T[j]*math.log(T[j],2.71)
            threshentroygram[i]=f1+f2
        thresh=np.where(threshentroygram==max(threshentroygram))
        ret=thresh[0][0]
        img1=img.copy()
        img1[img1>ret]=255
        img1[img1<=ret]=0
        return ret,img1
    thresh,dst=threshentroy(src)
    print(thresh)
    cv.imshow('src',src)
    cv.imshow('dst',dst)
    cv.waitKey(0)
    
    

    117

    在这里插入图片描述

    otsu阈值处理

    在这里插入图片描述

    python

    import numpy as np
    import cv2
    import math
    #计算图像灰度直方图
    def calcGrayHist(image):
        #灰度图像矩阵的宽高
        rows,cols = image.shape
        #存储灰度直方图
        grayHist = np.zeros([1,256],np.uint32)
        for r in range(rows):
            for c in range(cols):
                grayHist[0][image[r][c]] +=1
        return grayHist
    def ostu(image):
        rows,cols = image.shape
        #计算图像的灰度直方图
        grayHist = calcGrayHist(image)
        #归一化灰度直方图
        uniformGrayHist = grayHist/float(rows*cols)
        #计算零阶累积矩(sigma概率)和一阶累积矩(sigma概率乘灰度值)
        zeroCumuMoment = np.zeros([1,256],np.float32)
        oneCumuMoment = np.zeros([1,256],np.float32)
        for k in range(256):
            if k == 0:
                zeroCumuMoment[0][k] = uniformGrayHist[0][0]
                oneCumuMoment[0][k] = (k+1)*uniformGrayHist[0][0]
            else:
                zeroCumuMoment[0][k] = zeroCumuMoment[0][k-1] + uniformGrayHist[0][k]
                oneCumuMoment[0][k] = oneCumuMoment[0][k-1] + k*uniformGrayHist[0][k]
        #计算类间方差
        variance = np.zeros([1,256],np.float32)
        for k in range(255):
            if zeroCumuMoment[0][k] == 0:
                variance[0][k] = 0
            else:
                variance[0][k] = math.pow(oneCumuMoment[0][255]*zeroCumuMoment[0][k] - oneCumuMoment[0][k],2)/(zeroCumuMoment[0][k]*(1.0-zeroCumuMoment[0][k]))
        #找到阈值
        threshLoc = np.where(variance[0][0:255] == np.max(variance[0][0:255]))
        thresh = threshLoc[0]
        #阈值处理
        threshold = np.copy(image)
        print(thresh)
        threshold[threshold > thresh] = 255
        threshold[threshold <= thresh] = 0
        return threshold
    src=cv2.imread(r'C:\Users\19583\Desktop\4.jpg',cv2.IMREAD_GRAYSCALE)
    src=cv2.resize(src,(500,500))
    dst=ostu(src)
    cv2.imshow('src',src)
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    

    在这里插入图片描述

    opencv中提供了现成的函数

    import cv2 as cv
    import numpy as np
    src=cv.imread(r'C:\Users\19583\Desktop\3.jpg',cv.IMREAD_GRAYSCALE)
    src=cv.resize(src,(500,500))
    thresh,dst=cv.threshold(src,0,255,type=cv.THRESH_OTSU|cv.THRESH_BINARY)#这个0是随便写的,OTSU模式加会用otsu得到的阈值做二值处理
    print(thresh)
    cv.imshow('src',src)
    cv.imshow('dst',dst)
    cv.waitKey(0)
    

    139.0
    在这里插入图片描述

    自适应阈值分割

    如果一个图像光照不均(没有明显的双峰)用上面的方法就不好了,用自适应阈值分割就好了,根据不同地方周围的情况不同地方的阈值不一样。
    以平滑的值作为阈值,根据经验,平滑的算子大小要大于被识别物体的大小。
    在这里插入图片描述
    自适应操作过程

    1. 对图像进行平滑处理结果存在一个矩阵中
    2. 将(1-a)*b作为各点的阈值(a为调整用的参数一般取0.15,b是对应位置的平滑结果)

    python实现:

    import cv2 as cv
    import numpy as np
    src=cv.imread(r'C:\Users\19583\Desktop\4.jpg',cv.IMREAD_GRAYSCALE)
    src=cv.resize(src,(500,500))
    
    def adaptiveThresh(img,size,x):
        a = cv.GaussianBlur(img, size, 2, borderType=cv.BORDER_REFLECT)
        rows,cols=img.shape
        img1=img.copy()
        for r in range(rows):
            for c in range(cols):
                if img1[r][c]>a[r][c]*(1-x):
                    img1[r][c]=255
                else:
                    img1[r][c]=0
        return img1
    dst1=adaptiveThresh(src,(3,3),0.15)
    dst2=adaptiveThresh(src,(23,23),0.15)
    cv.imshow('src',src)
    cv.imshow('dst1',dst1)
    cv.imshow('dst2',dst2)
    cv.waitKey(0)
    

    在这里插入图片描述

    opencv自带函数:

    import cv2 as cv
    import numpy as np
    src=cv.imread(r'C:\Users\19583\Desktop\4.jpg',cv.IMREAD_GRAYSCALE)
    src=cv.resize(src,(500,500))
    dst1=cv.adaptiveThreshold(src,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,thresholdType=cv.THRESH_BINARY,blockSize=3,C=0.15)#图,最大值(阈值分割后),平滑方法(只有均值和高斯),取阈值方法,算子大小.C是那个a
    cv.imshow('src',src)
    cv.imshow('dst1',dst1)
    cv.waitKey(0)
    

    在这里插入图片描述

    二值图的逻辑运算

    对图像进行阈值分割后得到二值图,可以进行或,与的运算,opencv提供了现成的函数:
    在这里插入图片描述
    在这里插入图片描述
    很简单就直接放图了

    展开全文
  • 小波阈值去噪

    千次阅读 2021-04-26 10:48:44
    小波阈值去噪小波阈值去噪目录1.概念2.原理3.影响降噪效果的因素3.1小波基的选择3.2分解层数的选择3.3阈值的选择3.4阈值函数的选择4.MATLAB代码参考文献小波分析即用Mallat塔式算法对信号进行降阶分解。该算法在每...

    小波阈值去噪

    小波阈值去噪

    目录

    1.概念

    2.原理

    3.影响降噪效果的因素

    3.1小波基的选择

    3.2分解层数的选择

    3.3阈值的选择

    3.4阈值函数的选择

    4.MATLAB代码

    参考文献

    小波分析即用Mallat塔式算法对信号进行降阶分解。该算法在每尺度下将信号分解成近似分量与细节分量。近似分量表示信号的高尺度,即低频信息;细节分量表示信号的低尺度,即高频信息。

    对含有噪声的信号,噪声分量的主要能量集中在小波分解的细节分量中。

    2.原理

    小波阈值去噪的实质为抑制信号中无用部分、增强有用部分的过程。小波阈值去噪过程为:(1)分解过程,即选定一种小波对信号进行n层小波分解;(2)阈值处理过程,即对分解的各层系数进行阈值处理,获得估计小波系数;(3)重构过程,据去噪后的小波系数进行小波重构,获得去噪后的信号。

    c4e6bff9679c4be0aaf70289579c8bc4.png

    小波阈值去噪过程

    79e2fa9c9111817310a79c79abc9b905.png

    小波分解重构过程

    小波分解:X->ca3,cd3,cd2,cd1;小波重构:ca3,cd3,cd2,cd1->X。其中ca为低频信息、近似分量,cd为高频、细节分量。

    3.影响降噪效果的因素

    3.1小波基的选择

    在对信号进行小波分解时需要选择合适的小波基,由于没有任何一种小波基可以对不同类型的信号达到最优的分解效果,因此,如何选择小波基成为小波分解的一个重点。针对现实中的信号,小波基的选择一般要考虑以下几个因素:支撑长度、对称性、消失矩、正则性、相似性。针对一维信号,例如语音信号,通常选择dB小波和sym小波。

    3.2分解层数的选择

    在对信号进行小波分解时,分解的层数取得越大,则噪声和信号表现的不同特性越明显,越有利于二者的分离,但是分解的层数越大,经过重构的信号失真也会越大,在一定程度上会对信号去噪的效果产生较差的影响。因此,如何选择分解层数以解决信噪分离效果和重构信号失真之间的矛盾呢?

    小波分解的频段范围与采样频率有关。若进行N层分解,则各个频段范围为:

    b3abc827df1499453473b59e00c39dc0.png

    假设原始信号X的采样频率为1000Hz,则信号的最大频率为500,对该信号做3层小波分解,则各个频段范围如下图所示。

    f4612bfe67de56b7710716ac2c7c36d5.png

    3.3阈值的选择

    在小波域,有效信号对应的系数很大,而噪声对应的系数很小并且仍满足高斯分布。因此可以通过设定阈值将信号在小波域某段区间内的系数置零,就能最大程度的抑制噪声,同时只是稍微损伤有效信号。

    阈值选择规则基于模型

    baaebe6f4a697abc5d87247edf6dfcfe.gif

    bbe156dcae16489c1bbba2b55b2bb551.gif是高斯白噪声。

    目前常见的阈值选择方法有:无偏风险估计阈值、极大极小阈值、固定阈值、启发式阈值。

    MATLAB自带的自适应阈值选择函数,调用格式如下:

    thr=thselect(X,str);

    根据字符串str定义的阈值选择方法求信号X的自适应阈值thr。

    str= 'rigrsure':无偏风险估计阈值;

    str= 'minimaxi':极大极小阈值;

    str= 'sqtwolog':固定阈值;

    str= 'heursure':启发式阈值。

    e47c53f9ea434aa38ab2203d9646b037.png

    一般来讲,极大极小阈值和无偏风险估计阈值比较保守,当噪声在信号的高频段分布较少时,这两种阈值估计方法效果较好,可以将微弱的信号提取出来。而固定阈值和启发式阈值去噪比较彻底,在去噪时显得更为有效,但是也容易把有用的信号误认为噪声去掉。

    3.4阈值函数的选择

    在确定了高斯白噪声在小波域的阈值门限之后,就需要有个阈值函数对含有噪声系数的小波系数进行过滤,去除高斯噪声系数,常用的阈值函数有硬阈值函数和软阈值函数。

    3.4.1硬阈值函数

    当小波系数的绝对值大于给定阈值时,小波系数不变;小于阈值时,小波系数置零。

    99c1724192d3c7665d7f56dc28cb7f7d.png

    3.4.2软阈值函数

    当小波系数的绝对值大于给定阈值时,令小波系数减去阈值;小于阈值时,小波系数置零。

    3d7f5ef263ba603f063b677b150fd5e2.png

    MATLAB自带的阈值处理函数,调用格式如下:

    Y=wthresh(X,SORH,thr);

    返回输入向量或矩阵X经过软阈值(SORH=’s’)或硬阈值(SORH=’h’)处理后的信号Y,thr是阈值。

    4.MATLAB代码

    %% 基于小波变换的阈值去噪

    clc;

    clear;

    close all;

    tic;

    %% 用db8小波对含噪信号进行5层分解并提取系数

    [c,l]=wavedec(y,5,'db8'); % y为含噪信号

    %取第5层低频近似系数

    ca5=appcoef(c,l,'db8',5);

    %取各层高频细节系数

    cd5=detcoef(c,l,5);

    cd4=detcoef(c,l,4);

    cd3=detcoef(c,l,3);

    cd2=detcoef(c,l,2);

    cd1=detcoef(c,l,1);

    %% 阈值获取

    % [thr,sorh,keepapp]=ddencmp('den','wv',y); % 函数ddencmp用于获取信号在消噪或压缩过程中的默认阈值

    thr=thselect(y,'rigrsure'); % 自适应阈值选择使用Stein的无偏风险估计原理

    % thr=thselect(y,'heursure'); % 使用启发式阈值选择

    % thr=thselect(y,'sqtwolog'); % 阈值等于sqrt(2*log(length(X)))

    % thr=thselect(y,'minimaxi'); % 用极大极小原理选择阈值

    %% 进行硬阈值处理

    yhard5=wthresh(cd5,'h',thr);

    yhard4=wthresh(cd4,'h',thr);

    yhard3=wthresh(cd3,'h',thr);

    yhard2=wthresh(cd2,'h',thr);

    yhard1=wthresh(cd1,'h',thr);

    c1=[ca5;yhard5;yhard4;yhard3;yhard2;yhard1];

    y1=waverec(c1,l,'db8');

    %% 进行软阈值处理

    ysoft5=wthresh(cd5,'s',thr);

    ysoft4=wthresh(cd4,'s',thr);

    ysoft3=wthresh(cd3,'s',thr);

    ysoft2=wthresh(cd2,'s',thr);

    ysoft1=wthresh(cd1,'s',thr);

    c2=[ca5;ysoft5;ysoft4;ysoft3;ysoft2;ysoft1];

    y2=waverec(c2,l,'db8');

    %% 对上述信号进行图示

    figure(1);

    plot(y);title('含噪信号');

    axis tight;

    figure(2);

    plot(y1);title('硬阈值处理'); %降噪信号时域图

    axis tight;

    figure(3);

    plot(y2);title('软阈值处理'); %降噪信号时域图

    axis tight;

    fs=50;N=4000; % 采样频率为50MHz,采样点数为4000

    figure(4);

    [f1(:,1),A1(:,1)]=PinPu(y1,fs,N);

    plot(f1(:,1),A1(:,1));

    title('硬阈值处理');legend('D denoise Signal'); %降噪信号频谱图

    axis tight;

    figure(5);

    [f2(:,1),A2(:,1)]=PinPu(y2,fs,N);

    plot(f2(:,1),A2(:,1));

    title('软阈值处理');legend('D denoise Signal'); %降噪信号频谱图

    axis tight;

    toc;

    参考文献

    [1]司莉,毕贵红,魏永刚等.基于RQA与SVM的声发射信号检测识别方法[J].振动与冲击,2016,35(2):98.

    [2]有关小波的几个术语及常见的小波基介绍

    [3]小波变换和小波阈值法去噪

    [4]基于MATLAB的小波阈值去噪

    小波阈值去噪相关教程

    Halcon阈值算子 -- 局部阈值之var_threshold

    Halcon阈值算子 -- 局部阈值之var_threshold Halcon阈值算子 – 局部阈值之var_threshold 与local_threshold类似,var_threshold也是基于局部均值和方差。只不过计算公式不一样。 算子的函数签名如下: var_threshold(Image : Region : MaskWidth, MaskHeight

    基于阈值的图像二值化方法

    基于阈值的图像二值化方法 1.以经验值128作为阈值分割 2.手动调试,寻找更好的阈值 3.自动选择合适的阈值方法 首先选取灰度值128为阈值,使用固定阈值的二值化处理,观察分割效果。得出两组由灰度值小于128和大于等于128 的像素组成的像素群,做出两组像素群

    Halcon阈值算子 -- 局部阈值之local_threshold

    Halcon阈值算子 -- 局部阈值之local_threshold Halcon阈值算子 – 局部阈值之local_threshold 按照官方文档介绍,本算子适合文本二值化(This algorithm is a text binarization technique and provides good results for document images)。 算子的函数签名

    OpenCV-Python官方教程-32-计算摄影学图像去噪

    OpenCV-Python官方教程-32-计算摄影学图像去噪 学习使用非局部平均值去噪算法去除图像中的噪音 学习函数 cv2.fastNlMeansDenoising(),cv2.fastNlMeansDenoisingColored()等 我们已经学习了很多图像平滑技术,比如高斯平滑,中值平滑等,当噪声比较小时这些技

    2020-10-19 可视化HSV色彩空间阈值编辑器

    2020-10-19 可视化HSV色彩空间阈值编辑器 cv2.inRange(dst, hsv_low, hsv_high): 第一个参数:dst指的是原图 第二个参数:low_hsv指的是图像中低于这个low_hsv的值,图像值变为0(黑色) 第三个参数:high_hsv指的是图像中高于这个high_hsv的值,图像值变为0

    JAVA程序设计:带阈值的图连通性(LeetCode:5128)

    JAVA程序设计:带阈值的图连通性(LeetCode:5128) 有 n 座城市,编号从 1 到 n 。编号为 x 和 y 的两座城市直接连通的前提是: x 和 y 的公因数中,至少有一个 严格大于 某个阈值 threshold 。更正式地说,如果存在整数 z ,且满足以下所有条件,则编号 x

    数字图像处理-DFTDCTWHT小波变换分解重构(Matlab)

    数字图像处理-DFTDCTWHT小波变换分解重构(Matlab) 文章目录 数字图像处理-DFTDCTWHT小波变换分解重构(Matlab) 基本的matlab图像处理函数的使用 代码块 运行效果 傅里叶变换(DFT) 对图像进行傅里叶正变换 去除部分高频分量后对图像进行傅里叶逆变换 离散余弦变

    图像处理与小波变换-Python实现

    图像处理与小波变换-Python实现 关于小波变换的理论知识,可以查看我的另一篇文章→小波变换入门 本文主要介绍小波变换在图像分解中的应用及其Python实现。 按照滤波组理论,图像的二维离散小波分解和重构过程如下图所示,分解过程可描述为:首先对图像的每一

    展开全文
  • OpenCV内阈值处理方法

    2021-06-13 21:52:34
    阈值分割是指剔除图像内高于一定值或者低于一定值的像素点。例如,设定阈值为“127”,将图像内: l所有像素值大于127的像素点设为255 l所有像素值小于等于127的像素点设为0 通过上述方式,会得到一幅二值图像。...

    阈值分割是指剔除图像内高于一定值或者低于一定值的像素点。例如,设定阈值为“127”,将图像内:

    l所有像素值大于127的像素点设为255

    l所有像素值小于等于127的像素点设为0

    通过上述方式,会得到一幅二值图像。如图6- 1所示,按照上述阈值分割方式将一副灰度图像处理为一幅二值图像,有效地实现了前景和背景的分离。

     

    图6- 阈值分割示例

    在OpenCV中提供了函数cv2.threshold()和函数cv2.adaptiveThreshold()实现阈值分割。

    6.1 threshold函数

    在OpenCV3.0内使用cv2.threshold()函数进行阈值化处理,该函数的语法格式为:

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

    式中:

    lretval – 返回的阈值。

    ldst – 阈值分割结果图像,与原始图像具有相同的大小和类型。

    lsrc – 要进行阈值分割的图像,可以是多通道的,832的浮点型

    lthresh – 要设定的阈值。

    lmaxval – 当type参数为THRESH_BINARY或者THRESH_BINARY_INV类型时,需要设定的最大值。

    ltype – 阈值分割的类型,具体类型值如表6- 1所示。

    表6- 阈值分割类型

     

     

    上述公式相对抽象,可以将其可视化,具体如图6- 2所示。

    图6- 阈值类型

    6.1.1 二值化阈值(cv2.THRESH_BINARY

    二值化阈值是指将原始图像处理为仅有两个值的二值图像,其示意图如图6- 4所示。其针对像素点的处理方式为:

    l灰度值大于阈值的像素点,将其灰度值设定为最大值。

    l灰度值小于等于阈值的像素点,将其灰度值设定为0。

    图6- 二值阈值化

    如果使用表达式表示,其目标值的产生规则为:

     

     

    式中,是选定的特定阈值。

    在8位图像中,最大值是255。因此,在对8位灰度图像进行二值化时,如果将阈值设定为127,那么:

    l所有大于127的像素点会被处理为255

    l其余值会被处理为0。

    为了说明上的方便,后续说明中,我们都以8位图为例说明,即其最大值为255。

    【例6.1】使用函数cv2.threshold()对数组进行二值化阈值处理,观察处理结果。

    根据题目要求,编写代码如下:

    import cv2
    import numpy as np
    img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    print("img=\n",img)
    print("t=",t)
    print("rst=\n",rst)
    

     

    运行程序,结果如下所示:

    img=

     [[184 204  23 247 118]

     [173 107 120  69 209]

     [231 218  42 211 108]

     [133 125  29 191 198]]

    t= 127.0

    rst=

     [[255 255   0 255   0]

     [255   0   0   0 255]

     [255 255   0 255   0]

     [255   0   0 255 255]]

    【例6.2使用函数cv2.threshold()对图像进行二值化阈值处理。

    根据题目要求,编写代码如下:

    import cv2
    img=cv2.imread("lena.bmp")
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 4所示。图中左侧是原始图像,右侧是二值化阈值处理结果。

     

    图6- 二值化阈值处理结果

    6.1.2 反二值化阈值(cv2.THRESH_BINARY_INV

    反二值化阈值的处理结果仍旧是仅有两个值的二值图像,与二值化阈值不同之处在于对像素值的处理方式不同,反二值化阈值针对像素点的处理方式为:

    l大于阈值的像素点,将其值设定为0

    l小于等于阈值的像素点,将其值设定为255

    反二值化阈值处理方式的示意图如图6- 5所示。

    图6- 二值阈值化

    如果使用表达式表示,其目标值的产生规则为:

     

     

     

    式中,thresh是选定的阈值。

    【例6.3使用函数cv2.threshold()对数组进行反二值化阈值处理,观察处理结果。

    根据题目要求,编写代码如下:

     

    import cv2
    import numpy as np
    img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    print("img=\n",img)
    print("t=",t)
    print("rst=\n",rst)
    

     

    运行程序,结果如下所示:

    img=

     [[ 56  64 150  48  41]

     [108 165 112 213 110]

     [122 244  10 213  46]

     [247  30  90   0  26]]

    t= 127.0

    rst=

     [[255 255   0 255 255]

     [255   0 255   0 255]

     [255   0 255   0 255]

     [  0 255 255 255 255]]

    【例6.4使用函数cv2.threshold()对图像进行反二值化阈值处理。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("lena.bmp")
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 6所示。图中左侧是原始图像,右侧是反二值化阈值处理结果。

     

    图6- 反二值化阈值结果

    6.1.3 截断阈值化(cv2.THRESH_TRUNC

    截断阈值化是指将图像中大于阈值的像素点设定为阈值,小于该阈值的像素点保持不变。其处理方式的示意图如图6- 7所示。

    图6- 截断阈值化

    例如:阈值选取为127,则截断阈值化处理时:

    l大于127的像素点,其值被设定为127。

    l小于等于127像素点,其值保持改变。

    如果使用表达式表示,其目标值的产生规则为:

     

     

     

    【例6.5使用函数cv2.threshold()对数组进行截断阈值化处理,观察处理结果。

    根据题目要求,编写代码如下:

     

    import cv2
    import numpy as np
    img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
    print("img=\n",img)
    print("t=",t)
    print("rst=\n",rst)
    

     

    运行程序,结果如下所示:

    img=

     [[190  60 146  22  22]

     [253  49  63 180 113]

     [ 27  64 148  44   7]

     [ 11 100 249  47 239]]

    t= 127.0

    rst=

     [[127  60 127  22  22]

     [127  49  63 127 113]

     [ 27  64 127  44   7]

     [ 11 100 127  47 127]]

    【例6.6使用函数cv2.threshold()对图像进行截断阈值化处理。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("lena.bmp")
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 8所示。图中左侧是原始图像,右侧是截断阈值化处理结果。

     

    图6- 截断阈值化处理结果

    6.1.4 超阈值零处理(cv2.THRESH_TOZERO_INV

    超阈值零处理是指将图像中大于阈值的像素点处理为0,小于该阈值的保持不变。即先选定一个阈值,然后对图像做如下处理:

    l大于阈值的像素点,像素值处理为0

    l小于等于阈值的像素点,值保持不变。

    超阈值零处理的工作原理如图6- 9所示。

    图6- 超阈值零处理

    例如:阈值选取为127,则:

    l大于127的像素点设定为0

    l小于等于127的像素点保持改变

    如果使用表达式表示,其目标值的产生规则为:

     

     

     

    【例6.7使用函数cv2.threshold()对数组进行超阈值零处理,观察处理结果。

    根据题目要求,编写代码如下:

     

    import cv2
    import numpy as np
    img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
    print("img=\n",img)
    print("t=",t)
    print("rst=\n",rst)
    

     

    运行程序,结果如下所示:

    img=

     [[ 16  68 231  94  82]

     [112 195 239 127  71]

     [ 67  47 240 107 227]

     [144  51 130 207 164]]

    t= 127.0

    rst=

     [[ 16  68   0  94  82]

     [112   0   0 127  71]

     [ 67  47   0 107   0]

     [  0  51   0   0   0]]

    【例6.8使用函数cv2.threshold()对图像进行超阈值零处理。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("lena.bmp")
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 10所示。图中左侧是原始图像,右侧是超阈值零处理结果。

     

    图6- 10 超阈值零处理结果

    6.1.5 低阈值零处理(cv2.THRESH_TOZERO

    低阈值零处理是指将图像中小于等于阈值的像素点处理为0大于阈值的像素点保持不变。即先选定一个阈值,然后对图像做如下处理:

    l大于阈值的像素点,值保持不变;

    l小于等于阈值的像素点,值变为0

    其示意图如图6- 11所示。

    图6- 11 低阈值零处理

    例如:阈值选取为127,则:

    l大于127的像素点,像素值保持改变

    l小于等于127的像素点,像素值设定为0

    如果使用表达式表示,其目标值的产生规则为:

     

     

     

    【例6.9使用函数cv2.threshold()对数组进行低阈值零处理,观察处理结果。

    根据题目要求,编写代码如下:

     

    import cv2
    import numpy as np
    img=np.random.randint(0,256,size=[4,5],dtype=np.uint8)
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
    print("img=\n",img)
    print("t=",t)
    print("rst=\n",rst)
    

     

    运行程序,结果如下所示:

    img=

     [[ 73  57 135  10   8]

     [127 162 110 217  54]

     [203  99 205  97 127]

     [ 14 100  83 226  71]]

    t= 127.0

    rst=

     [[  0   0 135   0   0]

     [ 0 162   0 217   0]

     [203   0 205   0   0]

     [  0   0   0 226   0]]

    【例6.10使用函数cv2.threshold()对图像进行低阈值零处理。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("lena.bmp")
    t,rst=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
    cv2.imshow("img",img)
    cv2.imshow("rst",rst)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 12所示。图中左侧是原始图像,右侧是低阈值零处理结果。

     

    图6- 12 低阈值零处理结果

    6.2 自适应阈值

    对于色彩均衡的图像,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像色彩是不均衡的,此时如果仅仅使用一个阈值处理,就无法得到清晰有效的阈值分割结果图像。

    有一种改进的阈值技术,其使用变化的阈值完成对图像的阈值处理。这种技术被称为自适应阈值处理。自适应阈值在进行阈值处理时,通过计算每个像素周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。相比较普通的阈值处理方法,自适应阈值处理能够更好地处理明暗差异较大的图像。

    OpenCV提供了函数cv2.adaptiveThreshold()实现自适应阈值分割,该函数的语法格式为:

    dst = cv.adaptiveThreshold( src, maxValue, adaptiveMethod, thresholdType, blockSize, C )

    式中:

    ldst:自适应阈值处理结果;

    lsrc:要进行处理的源图像。需要注意的是,该图像必须是8位单通道的图像;

    lmaxValue:最大值;

    ladaptiveMethod:自适应方法;

    lthresholdType:阈值处理方式,该值必须是cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV二者之一;

    lblockSize:块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为3/5/7等;

    lC:常量。

    函数cv2.adaptiveThreshold()根据参数adaptiveMethod来确定自适应阈值的方法。函数包含cv2.ADAPTIVE_THRESH_MEAN_Ccv2.ADAPTIVE_THRESH_GAUSSIAN_C两种不同的方法。这两种方法都是逐个像素地计算自适应阈值,自适应阈值通过计算每个像素由“参数blockSize”所指定邻域的加权平均值减去“常量C”得到。两种不同的方法,计算邻域的加权平均值时所使用的方式有所不同:

    lcv2.ADAPTIVE_THRESH_MEAN_C:,邻域所有像素点的权值是一致的;

    lcv2.ADAPTIVE_THRESH_GAUSSIAN_C:根据邻域各个像素点到中心点的距离通过高斯方程得到权重值;

    【例6.11对一幅图像分别使用二值化阈值函数cv2.threshold()和自适应阈值函数cv2.adaptiveThreshold()进行处理,观察处理结果的差异。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("computer.jpg",0)
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
    athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
    cv2.imshow("img",img)
    cv2.imshow("thd",thd)
    cv2.imshow("athdMEAN",athdMEAN)
    cv2.imshow("athdGAUS",athdGAUS)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 13所示。图中:

    l图(a)是原始图像

    l图(b)是二值化阈值处理结果

    l图(c)是自适应阈值采用参数cv2.ADAPTIVE_THRESH_MEAN_C的处理结果

    l图(d)是自适应阈值采用参数cv2.ADAPTIVE_THRESH_GAUSSIAN_C的处理结果

       

           (a)       (b)       (c)       (d)

    图6- 13 处理结果

    通过对比普通的阈值分割与自适应阈值分割可以发现,自适应阈值分割保留了更多的细节信息。在一些极端情况下,普通的阈值分割会丢失大量的信息,而自适应可以得到效果更好的二值图像。

    6.3 OTSU处理

    在使用函数cv2.threshold()进行阈值分割时,需要自定义一个阈值,并以此阈值作为图像阈值分割的依据。通常情况下,处理的是色彩均衡的图像,这时直接将阈值设为“127”是比较合适的。

    但是,有时图像灰度级的分布是不均衡的,如果此时还将阈值设置为“127”,那么阈值分割的结果就是失败的。例如,有一个图像img,里面的值为:

    [[123 123 123 123 123]

     [123 123 123 123 123]

     [123 123 126 126 126]

     [123 123 126 126 126]

     [123 123 126 126 126]]

    此时,如果仍旧以127作为阈值,那么分割结果是:

    [[0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]]

    很显然,这不是我们想要的结果。对于img,我们可以观察到如果以阈值“125”进行分割,可以得到较好的结果:

    [[  0   0   0   0   0]

     [  0   0   0   0   0]

     [  0   0 255 255 255]

     [  0   0 255 255 255]

     [  0   0 255 255 255]]

    但是,在实际处理中图像是复杂的,不太可能像上述img一样,一眼就观察出最合适的阈值。如果一个个去尝试,工作量无疑是巨大的。

    Otsu方法能够根据当前图像给出最佳的类间分割阈值。简而言之,Otsu方法就是遍历所有可能阈值,从而找到最佳的阈值。

    在OpenCV中,提供了实现Otsu方法的方式。通过在函数cv2.threshold()中对参数type的类型多传递一个参数“cv2.THRESH_OTSU”即可实现Otsu方式的阈值分割。

    需要说明的是,在使用Otsu方法时,要把阈值设为0此时的函数cv2.threshold()会自动寻找最优阈值,并将该阈值返回。例如,如下语句:

    t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

    该语句中,让函数cv2.threshold()采用Otsu的方式进行阈值分割。与普通的阈值分割不同之处在于:

    l参数type,增加了一个参数值“cv2.THRESH_OTSU

    l设定的阈值为0

    l返回值t是Otsu方法计算得到并使用的最优阈值

    需要注意,如果采用普通的阈值分割,返回的阈值就是设定的阈值。例如:

    t,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)

    设定了阈值为“127”,所以最终的返回值“t=127”。

    【例6.12测试Otsu阈值处理的实现。

    根据题目要求,编写代码如下:

     

    import cv2
    import numpy as np
    img = np.zeros((5,5),dtype=np.uint8)
    img[0:6,0:6]=123
    img[2:6,2:6]=126
    print("img=\n",img)
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    print("thd=\n",thd)
    t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    print("otsu=\n",otsu)
    

     

    运行程序,结果如下所示。

    img=

     [[123 123 123 123 123]

     [123 123 123 123 123]

     [123 123 126 126 126]

     [123 123 126 126 126]

     [123 123 126 126 126]]

    thd=

     [[0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]

     [0 0 0 0 0]]

    otsu=

     [[  0   0   0   0   0]

     [  0   0   0   0   0]

     [  0   0 255 255 255]

     [  0   0 255 255 255]

     [  0   0 255 255 255]]

    【例6.13对一幅图像分别使用普通的二值化阈值处理和Otsu阈值处理,观察处理结果的差异。

    根据题目要求,编写代码如下:

     

    import cv2
    img=cv2.imread("tiffany.bmp",0)
    t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
    t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
    cv2.imshow("img",img)
    cv2.imshow("thd",thd)
    cv2.imshow("otus",otsu)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

     

    运行程序,结果如图6- 14所示。图中:

    l图(a)是原始图像;

    l图(b)是普通二值化阈值采用阈值为127点的处理结果;

    l图(c)是二值化阈值采用参数cv2.THRESH_OTSU后的处理结果。

      

    图6- 14 处理结果

    本例中,图像整体的亮度较高,即有较多的像素值都是大于127的。所以:

    l在使用127作为阈值进行普通的二值阈值化时,得到了大量的白色;

    l在使用Otsu处理时,因为通过计算采用了最优阈值,所以得到了较好的处理结果。


    本内容节选自李立宗主编的《OpenCV轻松入门——面向Python》,电子工业出版社。

    参加视频学习:

    https://edu.csdn.net/course/detail/10552

     

    微信搜索【cvlight】,关注【计算机视觉之光】,学习计算机视觉知识。

     

     

     

     

    展开全文
  • 图像分割是许多计算机视觉...图像阈值是一种简单、有效的图像分割方法,其中像素根据其强度值进行分区。在本文中,将介绍 OpenCV 所提供的主要阈值技术,可以将这些技术用作计算机视觉应用程序中图像分割的关键部分。
  • MATLAB中实现了信号的阈值去噪,主要包括阈值去噪和阈值获取两方面。1.阈值获取MATLAB中实现阈值获取的函数有ddencmp、thselect、wbmpen和wwdcbm,下面对它们的用法进行简单的说明。ddencmp的调用格式有以下三种:(1...
  • 这篇博客将延续上一篇简单阈值处理,继续介绍自适应阈值及Octus阈值
  • 3.1图像阈值分割技术基本原理 所谓图像分割是指根据灰度、彩色、空间纹理、几何形状等特征把图像划分成若干个互不相交的区域,使得这些特征在同一区域内,表现出一致性或相似性,而在不同区域间表现出明显的不同。...
  • 图像的阈值处理

    2021-02-08 23:15:31
    图像的阈值处理是指剔除图像内像素高于一定值或者低于一定值的像素点。在opencv中,函数cv2.threshold()或cv2.adaptiveThreshold()实现阈值处理。 一:cv2.threshold()函数 retval,dst=cv2.threshold(src,thresh,...
  • 固定阈值分割很直接,一句话说就是像素点值大于阈值变成一类值,小于阈值变成另一类值。
  • 在图像处理时,受外界光线的干扰一般比较大,假如在阈值分割时采用固定阈值,那么在环境改变时分割效果受影响极大,那么为了避免此影响就必须采用动态阈值,自动求出合适的阈值进行分割。本文的介绍几种主要的图像...
  • 文讲述了图像阈值处理的五种基本方法,同时介绍了自适应阈值方法,针对基本图像阈值处理采用Otsu获取迭代出最佳类间分割阈值,得到最好的阈值处理效果,使得图像分割出的特征更加明显有效。
  • 大津阈值分割(OSTU)

    千次阅读 2021-01-22 20:27:47
    大津法是一种灰度图像自适应阈值分割算法,是日本学者Ostu于1979年提出,又称类间方差阈值分割法。大津法根据图像的灰度分布将图像分为前景和背景两部分,前景是我们分割出来的部分。前景和背景的分割值就是我们要...
  • 引言前文我们讨论了关于实现OTSU算法的问题,该算法主要是针对于特征值阈值的确定,这个值可以用于论文讨论和说明。但实际情况中,我们需要对图像进行各种滤波,预处理,那么此时我们可能需要一种带坐标和投影的分割...
  • 基于matlab小波软阈值+硬阈值+改进阈值轴承故障仿真信号去噪 二、源代码 clc clear all close all fs = 20e3; % 采样频率 fn = 3e3; % 固有频率 y0 = 5; % 位移常数 g = 0.1; % 阻尼系数 T = 0.01; % 重复周期 N = ...
  • 在Matlab中图像分割是一个很重要的手段,其中迭代选择阈值法的阈值分割算是入门代码。这一次老师给了作业去补全其中代码的注释,在补全代码的过程中自己了解到了一些新知识,尽管知识很简单,代码也很短,但是自己...
  • OpenCV 滞后阈值及应用

    2021-01-28 15:40:55
    滞后阈值在OpenCV中的应用还是较多的,例:在canny边缘检测中,通过双阈值的滞后阈值处理进行较长边缘的连接。 滞后阈值原理 1. 若某一像素位置的幅值超过高阈值,则该位置被保留。 2. 若某一像素位置的幅值...
  • 阈值分割1. 全局阈值分割直方图技术法熵算法Otsu算法2. 局部阈值分割自适应阈值 阈值的分割的核心就是如何选取阈值,选取正确的阈值时分割成功的关键。可以使用手动设置阈值,也可以采用直方图技术法、Otsu算法、熵...
  • 图像分割__阈值分割

    2021-11-05 17:27:02
    阈值分割 为得到图像中的物体信息, 必须进行图像分割, 即提取图像中与感兴趣物体相对应的区域, 而其中最简单的分割算法是图像的阈值分割。 1. 全局阈值 使用过程中的五种阈值类型如上图所示 这种设定全局阈值的...
  • %半软半硬阈值去噪后的信噪比 SNRHS=10*log(sum(x1.^2)/(sum((HS3-x1).^2))) y3=uint8(HS3); subplot(2,2,4) imshow(y3); title('半软半硬阈值去噪'); % %一次小波分解图像 T1=[h00',h01';h10',h11']; y1=uint8(T1)...
  • 目标在本教程中,您将学习简单阈值处理,自适应阈值处理,Otsu阈值处理等。您将学习以下函数:cv2.threshold, cv2.adaptiveThreshold等。一、单的阈值在这里,事情是直截了当的。如果像素值大于阈值,则为其分配一个...
  • 阈值分割有很多种方法,本章学习直方图阈值、三角法阈值,迭代法阈值,大律法阈值,和自适应阈值。 1.直方图阈值 图像直方图阈值分割法: 算法描述:根据图像的灰度直方图寻找阈值。 算法特点:适应于于直方图为双峰...
  • 阈值分割:最大类间方差法 一、简介 最大类间方差法,又称为大津阈值法,或OTSU算法。是由日本学者大津在197919791979年提出的一种非参数的、无监督的自动选择阈值的图像分割方法。 二、算法描述 2.1 公式推导 对于...
  • 有时候单纯地以分数0.5位阈值划分样本为预测为1或者预测为0,效果有时候并不好,此时如何确定很好的阈值分数呢?答案是可以利用roc曲线来确定比较好的划分阈值。 ROC曲线介绍 二分类过程,设定阈值,大于该分数为1,...
  • openCV图像阈值

    2021-01-12 19:43:12
    #图像阈值 ''' #1.简单阈值: #当像素高于阈值时,我们给这个像素赋予新值,(可能白色)否则我们给其赋予另外一个新值(可能黑色) #使用到的函数:cv2.threshold(原图像(原图像是灰度图),(用来对像素值进行分类的...
  • 基于MATLAB改进Otsu阈值分割的车道线检测 摘要:在判断车道偏离以防止车辆碰撞等危害时,车道标线检测需要通过图像处理来进行,检测方法是否适用于各种背景环境条件以及检测的及时性至关重要传统的Otsu方法在处理对...
  • 直方图阈值分割 一般图像都有双峰性,一个峰是前景一个是后景。 一般取这两个峰值之间的最小值为图片的二值化的阈值 从而二值化图片 值得一提的是,对于任何一张图像,它的直方图中如果存在较为明显的...
  • 对于色彩均衡的图像来说,直接使用一个阈值就能完成对图像的阈值化处理。但是,有时图像的色彩是不均衡的,如果只用一个阈值,就无法得到清晰有效的阈值分割结果图像。 所以这一节我们介绍自适应阈值处理(阈值是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 362,687
精华内容 145,074
关键字:

阈值