精华内容
下载资源
问答
  • 在此提供两种方法,一,最大阈值分割(大律):I=imread('test.jpg');subplot(1,3,1);imshow(I);title('原图');I1=rgb2gray(I);subplot(1,3,2);imhist(I1);title('直方图');level=graythresh(I);g=im2bw(I,level);%...

    在此提供两种方法,一,最大阈值分割(大律法):

    I=imread('test.jpg');

    subplot(1,3,1);imshow(I);title('原图');

    I1=rgb2gray(I);

    subplot(1,3,2);imhist(I1);title('直方图');

    level=graythresh(I);

    g=im2bw(I,level);%最佳阈值level

    subplot(1,3,3);imshow(g);title('阈值分割');

    %在Command窗口输出灰度阈值

    disp(strcat('graythresh 计算灰度阈值:',num2str(uint8(level*255))))

    第二种:迭代求阈值

    I=imread('C:test.jpg');

    Zmax=max(max(I));

    Zmin=min(min(I));

    TK=(Zmax+Zmin)/2;%初始阈值

    flag=1;

    [m,n]=size(I);

    while(flag)

    fg=0;

    bg=0;

    fgsum=0;

    bgsum=0;

    for i=1:m

    for j=1:n

    tmp=I(i,j);

    if(tmp>=TK)

    fg=fg+1;

    fgsum=fgsum+double(tmp);

    else

    bg=bg+1;

    bgsum=bgsum+double(tmp);

    end

    end

    end

    u1=fgsum/fg;

    u2=bgsum/bg;

    TKTmp=uint8((u1+u2)/2);

    if(TKTmp==TK)

    flag=0;

    else

    TK=TKTmp;

    end

    end

    disp(strcat('迭代后的阈值:',num2str(TK)));

    newI=im2bw(I,double(TK)/255);

    subplot(1,2,1);imshow(I);title('原图')

    subplot(1,2,2);imshow(newI);tltle('阈值分割图');

    展开全文
  • 大津局部阈值分割

    万次阅读 2016-11-26 11:11:17
    opencv中大津局部阈值分割

    除了图像边缘,阈值也是图像分割中的一种重要方法。主要包含如下两类:

    (1)全局阈值分割

    (2)局部阈值分割

     

    全局阈值分割

    大津法是一种著名的全局阈值分割方法,它的优点在于完全以在一副图像的直方图上执行为基础,而直方图是很容易得到的一维阵列。它的思路是将图像直方图的灰度像素基于某一阈值分为两类,计算两类的类间方差,通过不断迭代,使得类间方差达到极小值,从而得到阈值。OPENCV中调用函数:

    threshold(edge,otsu,30,255,THRESH_BINARY|THRESH_OTSU);


    局部阈值分割

    当一幅图像中包含噪声和非均匀光照时,全局阈值分割法不再有效,因此应该采用基于图像局部特性的阈值分割方法(局部均值和局部方差)。OPENCV中提供了两种方法:平均、高斯加权,调用函数:

    adaptiveThreshold(edge,adtg,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY_INV,3,0);
    adaptiveThreshold(edge,adtg,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY_INV,3,0);

    操作时根据图像应进行模板大小的调整


    实验结果

    从左至右分别是原图、大津法分割、局部分割(高斯加权)结果,可以看出大津法分割效果较好。

       


    从左至右分别是原图、大津法分割、局部分割(均值)结果,可以看出局部分割效果较好。

      


    实际场景,两种简单的分割方法效果均不理想。




    总结

    (1)大津法的优点在于可以快速有效的找到类间分割阈值,但其缺点也很明显,就是只能针对单一目标分割,或者感兴趣的目标都属于同一灰度范围,若需探测目标灰度范围分布较大,则必将有一部分目标探测丢失(例如上图中黑色和白色的汽车)。

    (2)局部分割的优点在于可以进行多目标分割,缺点在于基于局部阈值分割出的目标连结性较差,包含噪声。





    展开全文
  • 光照不均匀局部阈值分割的opencv编码实现,博客上有介绍
  • 图像阈值分割-局部阈值分割 在Halcon中local_thresh算子实现局部阈值分割。其原型如下: local_threshold(Image : Region : Method, LightDark, GenParamName, GenParamValue : ) Image:输入图像 Region:输出分割...

    图像阈值分割-局部阈值分割

    在Halcon中local_thresh算子实现局部阈值分割。其原型如下:

    local_threshold(Image : Region : Method, LightDark, GenParamName, GenParamValue : )

    • Image:输入图像
    • Region:输出分割区域
    • Method:分割策略
    • LightDark:前景和背景的颜色
    • GenParamName:参数名称,‘mask_size’, ‘range’, ‘scale’
    • GenParamValue:参数GenParamName对应的值

    local_threshold使用Method中给出的阈值方法对单通道图像进行分段,并返回Region中的分段区域。 目前该算子仅提供方法’adapted_std_deviation’。 该算法是文本二值化技术,为文档图像提供了良好的结果。

    演示代码如下:

    * Init display
    dev_update_off ()
    dev_close_window ()
    read_image (Letters, 'letters')
    dev_open_window_fit_image (Letters, 0, 0, -1, -1, WindowHandle)
    set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
    
    * the strength of the adapted_std_deviation method more clearly.
    get_image_size (Letters, Width, Height)
    gen_image_surface_first_order (ImageSurface, 'byte', 0.5, 0.5, 0.5, Width / 2, Height / 2, Width, Height)
    add_image (Letters, ImageSurface, ImageCombined, 0.5, 0)
    
    GlobalThreshold := 128
    threshold (ImageCombined, RegionGlobal, 0, GlobalThreshold)
    dev_display (ImageCombined)
    dev_display (RegionGlobal)
    Message := 'In images with inhomogeneous background'
    Message[1] := 'it is impossible to segment the characters'
    Message[2] := 'with a global threshold.'
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    
    local_threshold (ImageCombined, Region, 'adapted_std_deviation', 'dark', [], [])
    * 
    * Display results
    dev_display (ImageCombined)
    dev_display (Region)
    Message := 'With a local threshold, the characters'
    Message[1] := 'can be segmented successfully.'
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    

    原图像:
    在这里插入图片描述
    程序运行结果:
    在这里插入图片描述

    展开全文
  • 第六节:阈值分割 一: 全阈值分割 实例代码: image = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE) the = 100 # 设置阈值为100 maxval = 255 dst, img = cv2.threshold(image, the, maxval, cv2.THRESH_...

    第六节:阈值分割

    一: 全阈值分割

     实例代码:

    image = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
    the = 100   # 设置阈值为100
    maxval = 255
    dst, img = cv2.threshold(image, the, maxval, cv2.THRESH_BINARY)
    cv2.imshow('hand_thresh', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

         给出你的阈值 ,然后告诉你的最大阈值是多少 。。。也就是你二值图中一个阈值为0,另外一个阈值可以指定为多少。。这里指定为255

      看一下输出结果。。

    二:局部阈值分割

          局部阈值分割的核心是计算阈值矩阵。。比较常用的是后面提到的自适应阈值算法。。我们等会后面讲实现。。

    三:直方图技术法

     

    代码实现:

    import numpy as np
    import cv2
    
    
    def calcGrayHist(image):
        '''
        统计像素值
        :param image:
        :return:
        '''
        # 灰度图像的高,宽
        rows, cols = image.shape
        # 存储灰度直方图
        grayHist = np.zeros([256], np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]] += 1
        return grayHist
    
    def threshTwoPeaks(image):
        # 计算灰度直方图
        histogram = calcGrayHist(image)
    
        # 找到灰度直方图的最大峰值对应的灰度值
        maxLoc = np.where(histogram == np.max(histogram))
        firstPeak = maxLoc[0][0]
    
        # 寻找灰度直方图的第二个峰值对应的灰度值
        measureDists = np.zeros([256], np.float32)
        for k in range(256):
            measureDists[k] = pow(k - firstPeak, 2)*histogram[k]
        maxLoc2 = np.where(measureDists == np.max(measureDists))
        secondPeak = maxLoc2[0][0]
    
        # 找两个峰值之间的最小值对应的灰度值,作为阈值
        thresh = 0
        if firstPeak > secondPeak:
            temp = histogram[int(secondPeak): int(firstPeak)]
            minLoc = np.where(temp == np.min(temp))
            thresh = secondPeak + minLoc[0][0] + 1
        else:
            temp = histogram[int(firstPeak): int(secondPeak)]
            minLoc = np.where(temp == np.min(temp))
            thresh = firstPeak + minLoc[0][0] + 1
    
        # 找到阈值,我们进行处理
        img = image.copy()
        img[img > thresh] = 255
        img[img <= thresh] = 0
        cv2.imshow('deal_image', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    if __name__ == '__main__':
    
        image = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
        threshTwoPeaks(image)

    输出结果:

    四:熵算法

      

    代码实现:

    import numpy as np
    import cv2
    import math
    
    def calcGrayHist(image):
        '''
        统计像素值
        :param image:
        :return:
        '''
        # 灰度图像的高,宽
        rows, cols = image.shape
        # 存储灰度直方图
        grayHist = np.zeros([256], np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]] += 1
        return grayHist
    
    
    def threshEntroy(image):
    
        rows, cols = image.shape
        # 求灰度直方图
        grayHist = calcGrayHist(image)
        # 归一化灰度直方图,即概率直方图
        normGrayHist = grayHist / float(rows*cols)
    
        # 第一步:计算累加直方图,也称零阶累积矩
        zeroCumuMoment = np.zeros([256], np.float32)
        for k in range(256):
            if k == 0:
                zeroCumuMoment[k] = normGrayHist[k]
            else:
                zeroCumuMoment[k] = zeroCumuMoment[k-1] + normGrayHist[k]
    
        # 第二步:计算各个灰度级的熵
        entropy = np.zeros([256], np.float32)
        for k in range(256):
            if k == 0:
                if normGrayHist[k] == 0:
                    entropy[k] = 0
                else:
                    entropy[k] = -normGrayHist[k]*math.log10(normGrayHist[k])
            else:
                if normGrayHist[k] == 0:
                    entropy[k] = entropy[k-1]
                else:
                    entropy[k] = entropy[k-1] - normGrayHist[k]*math.log10(normGrayHist[k])
        # 第三步:找阈值
        fT = np.zeros([256], np.float32)
        ft1, ft2 = 0.0, 0.0
        totalEntropy = entropy[255]
        for k in range(255):
            # 找最大值
            maxFront = np.max(normGrayHist[0: k+1])
            maxBack = np.max(normGrayHist[k+1: 256])
            if (maxFront == 0 or zeroCumuMoment[k] == 0
                    or maxFront == 1 or zeroCumuMoment[k] == 1 or totalEntropy == 0):
                ft1 = 0
            else:
                ft1 = entropy[k] / totalEntropy*(math.log10(zeroCumuMoment[k])/math.log10(maxFront))
    
    
            if (maxBack == 0 or 1-zeroCumuMoment[k] == 0
                    or maxBack == 1 or 1-zeroCumuMoment[k] == 1):
                ft2 = 0
            else:
                if totalEntropy == 0:
                    ft2 = (math.log10(1-zeroCumuMoment[k]) / math.log10(maxBack))
                else:
                    ft2 = (1-entropy[k]/totalEntropy)*(math.log10(1-zeroCumuMoment[k])/math.log10(maxBack))
            fT[k] = ft1 + ft2
    
        # 找最大值的索引,作为得到的阈值
        threshLoc = np.where(fT == np.max(fT))
        thresh = threshLoc[0][0]
    
        # 阈值处理
        threshold = np.copy(image)
        threshold[threshold > thresh] = 255
        threshold[threshold <= thresh] = 0
        return threshold
    
    if __name__ == '__main__':
        image = cv2.imread('img5.jpg', cv2.IMREAD_GRAYSCALE)
        img = threshEntroy(image)
        cv2.imshow('origin', image)
        cv2.imshow('deal_image', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    输出结果:

    五:Otsu算法

    这里就不具体实现了。。我们调用opencv给的API

    image = cv2.imread('img.jpg', cv2.IMREAD_GRAYSCALE)
    maxval = 255
    otsuThe = 0
    otsuThe, dst_Otsu = cv2.threshold(image, otsuThe, maxval, cv2.THRESH_OTSU)
    cv2.imshow('Otsu', dst_Otsu)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    输出结果:

     六:自适应阈值算法

     

    代码实现:

    import cv2
    import numpy as np
    
    def adaptiveThresh(I, winSize, ratio=0.15):
    
        # 第一步:对图像矩阵进行均值平滑
        I_mean = cv2.boxFilter(I, cv2.CV_32FC1, winSize)
    
        # 第二步:原图像矩阵与平滑结果做差
        out = I - (1.0 - ratio) * I_mean
    
        # 第三步:当差值大于或等于0时,输出值为255;反之,输出值为0
        out[out >= 0] = 255
        out[out < 0] = 0
        out = out.astype(np.uint8)
        return out
    
    if __name__ == '__main__':
        
        image = cv2.imread('img7.jpg', cv2.IMREAD_GRAYSCALE)
        img = adaptiveThresh(image, (5, 5))
        cv2.imshow('origin', image)
        cv2.imshow('deal_image', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    结果展示:
     

     

          未完待续。。。。。。

                                          下节你将能够学到一些形态学处理(腐蚀,膨胀等等)

    展开全文
  • 针对存在光照不均匀干扰的工业图像,提出了一种基于图像的多方向灰度波动局部阈值分割方法。先对图像进行均值滤波预处理;然后提取水平、垂直和左右对角线四个方向上的一维灰度波动曲线,并对每条曲线上满足波动幅度...
  • 阈值分割法简述

    千次阅读 2007-07-24 06:45:00
    阈值分割法 阈值分割法分为全局阈值法和局部阈值分割法。所谓局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。在阈值分割后,相邻子图像之间的边界处可能产生灰度级的不连续性,因此...
  • 1 全局固定阈值分割 threshold(image, global, th, 255, CV_THRESH_BINARY_INV);  一副图像包括目标、背景和噪声,设定某一阈值T将图像分成两部分:大于T的像素群和小于T的像素群。 在实际处理时候,...
  • 利用图像中与像素具有相似邻域结构的像素提取当前像素的非局部空间信息, 构造了基于像素的灰度信息和非局部空间灰度信息的二维直方图, 并将此二维直方图引入到Otsu曲线阈值分割法中, 提出了基于灰度和非局部空间...
  • 全局阈值分割
  • 20180338站位
  • 一种指纹图像的局部阈值分割算法.pdf 我的资源有 很多图像处理的 主要是指纹识别和文字识别
  • 阈值分割法 阈值分割法分为全局阈值法和局部阈值分割法。所谓局部阈值分割法是将原始图像划分成较小的图像,并对每个子图像选取相应的阈值。在阈值分割后,相邻子图像之间的边界处可能产生灰度级的不连续性,因此...
  • 基于灰度和非局部空间灰度特征的二维Otsu曲线阈值分割法_赵凤.caj
  • 局部阈值法 通过灰度直方图看到图像的照明效果 自适应阈值分割函数: CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst, double maxValue, int ...
  • 数字图像处理中采用阈值分割法对图像进行分割,采用的是MATLAB编程
  • 主要为大家详细介绍了利用OpenCV实现局部动态阈值分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 针对工业图像经常存在不均匀光照的干扰,提出一种光照不均匀图像的灰度波动局部阈值分割算法。从水平及垂直方向上提取图像的灰度波动曲线,并迭代搜索每条曲线上满足给定波动幅度阈值的较大尺度波峰点和波谷点;在每...
  • 局部自适应阈值分割方法

    万次阅读 2018-03-22 09:34:47
    Local_Yanowitz 由于光照的影响,图像的灰度可能是不均匀分布的,此时...Yanowitz提出了一种局部阈值分割方法。结合边缘和灰度信息找到阈值表面(treshhold surface)。在阈值表面上的就是目标。 算法的主要...
  • 关于论文《光照不均匀图像的灰度波动局部阈值分割》最近遇到了需要处理图像上光照不晕的问题,参考了论文《光照不均匀图像的灰度波动局部阈值分割》的方法,觉得它的效果很好,对图像的分析也比较到位。实际尝试以后...
  • %功能·:运用K-means算法对图像进行分割 % 输入 ima-输入的灰度图像 K-分类数 %输出 mu -均值类向量 mask-分类后的图像 ima=double(ima); copy=ima; ima=ima(:); mi=min(ima);%找到最小值 ima=ima-mi+1; s=length...
  • 基于Niblack's method方法的局部阈值分割 Email:whowhoha@outlook.com  /*原理:   T(x,y)=m(x,y) + k*s(x,y)   取一个宽度为w的矩形框,(x,y)为这个框的中心。  统计框内数据,T(x,y)为阈值,m(x...
  • matlab 实现图像阈值分割

    热门讨论 2010-12-22 22:05:52
    matlab 实现图像阈值分割 内容:包括程序流程图,程序代码,输出图像以及输出结果分析。对比观察法和局部阈值分割法。。。
  • 于是乎,这里就可以用到局部阈值分割。 halcon代码: dev_set_line_width (3) for Index := 1 to 2 by 1 read_image (Image, 'C:/Users/斌/Desktop/halcon-项目/瑕疵检测/表面污点检测/'+Index+'.jpg') ...
  • 经过长时间的发展,图像分割已经发展出了多类方法:基于阈值的方法,基于区域的方法,基于边缘的方法,基于深度学习的方法 基于阈值的方法是最基本也是历史比较长的方法,虽然简单直接,但在一些特殊领域中:光学...
  • Bersen算法 声明:本文参考于https://www.cnblogs.com/zhaopengpeng/p/13300795.html,并对该分割算法进行python实现。 Bersen算法原理 ... 如果M-N大于S,则当前P的阈值为T; 若小于S,则表...
  • 针对在岩石变形实验的熔融图像处理中,图像的...这种方法不仅能够解决全局阈值分割法亮度分布不均的问题,也能解决局部阈值分割法(Bernsen算法)抗噪声性能差的问题,同时运算效率提高38.5倍(和Bernsen算法比较)。
  • 局部阈值法

    2014-05-29 16:13:05
    阈值分割图片,很好用的程序,大家放心使用
  • 知道阈值分割的内容:全阈值分割,自适应阈值分割,熟悉大津 知道分水岭算法的原理 了解GrabCut算法 1 图像分割 所谓图像分割指的是根据灰度、颜色、纹理和形状等特征把图像划分成若干互...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,235
精华内容 6,494
关键字:

局部阈值分割法