精华内容
下载资源
问答
  • matlab 图像分割

    2020-05-13 16:03:33
    matlab图像分割什么是图像分割固定阈值分割自适应阈值分割分割效果增强平滑处理 什么是图像分割 将数字图像划分成不相交,不重合的区域的过程就叫图像分割。 这很像PhotoShop里面的快速选取工具,判断边界,分割边界...

    什么是图像分割

    将数字图像划分成不相交,不重合的区域的过程就叫图像分割。
    这很像PhotoShop里面的快速选取工具,判断边界,分割边界。

    固定阈值分割

    先上效果图
    在这里插入图片描述
    这里阈值我手动设置成了0.35,当然,你也可以通过“最大类间方差法”(OTSU)来找到一个最佳阈值。

    OTSU:找到灰度直方图中两峰之间的最低点作为阈值。

    %固定阈值分割
    %原图
    I = imread('coins.png');
    subplot(221);imshow(I);
    
    % 直方图
    subplot(2,2,[2,4]);imhist(I);
    
    %固定阈值分割,这里阈值为 0.35
    level = 0.35;
    
    %im2bw 为分割函数
    I_2bw = im2bw(I,level);
    subplot(223);imshow(I_2bw);
    

    自适应阈值分割

    先上效果图
    在这里插入图片描述
    采用自适应阈值分割方法比采用直方图分割有更好的分割效果。
    对于不同的图像的适应性也更强。

    %自适应阈值分割
    %原图
    I = imread('coins.png');
    subplot(221);imshow(I);
    I = im2double(I);
    
    %直方图
    subplot(2,2,[2,4]);imhist(I);
    
    diff = 0.01; %设定一个迭代终止值
    level1 = ( min(I(:)) + max(I(:)) ) / 2; %初值,当然自己目测一个常数也是可以的
    arr1 = find(I>level1);  %第一部分图像
    arr2 = find(I<=level1); %第二部分图像
    level2 = ( (mean(I(arr1))) + (mean(I(arr2))) ) / 2; %两部分图像取平均
    %通过迭代产生最佳阈值
    while abs(level1 - level2) < diff
        arr1 = find(I>level1);
        arr2 = find(I<=level1);
        level2 = ( (mean(I(arr1))) + (mean(I(arr2))) ) / 2;
    end
    
    %im2bw 为分割函数
    I_2bw = im2bw(I,level2);
    subplot(223);imshow(I_2bw);
    

    分割效果增强

    对于边界不是非常明显的图像,可以对图像进行“平滑处理”后再进行分割。

    平滑处理

    平滑处理,是增强图像边界的一种方式。

    展开全文
  • 顾名思义,该方法是使用最大类间方差实现图像分割最佳阈值的寻找。 为什么最大类间方差能实现分割阈值的寻找? 答:从统计学的意义上讲,方差是表征数据分布不均衡的统计量,方差越大,说明数据间的差别越明显...

                                            最大类间方差寻找最佳阈值实现图像的分割

    顾名思义,该方法是使用最大类间方差实现图像分割中最佳阈值的寻找。

     

    为什么最大类间方差能实现分割阈值的寻找?

    答:从统计学的意义上讲,方差是表征数据分布不均衡的统计量,方差越大,说明数据间的差别越明显。假设现在有一组数据A,找一个合适中间值K,将A分成A1A2两组,如果A1和A2两者之间的方差越大,这说明两组数据之间的区分越明显。我们在进行图像分割时,就是期望能找到一个这样的阈值K,使图像中的目标和背景分割开来,使背景和目标比较明显。

     

    实现步骤:

    1. 求取输入图像I直方图H以及整体灰度平均值U。根据直方图,求取每个灰度级所占的概率P(i)
    2. 设定K值,一般采用for循环(K=0:255),根据K值将图像分成两部分A和B,分别求取A的期望和B的期望,以及A和B概率P(A)、P(B)
    3. 最后,通过公式\sigma_{k}^{2}=P(A)*(u_A-U)^{2} + P(B)*(u_B-U)^{2}求取每个阈值K(0~255)下的方差,取其中的最大的\sigma _{k}^{2}所对应的K为整体的最佳阈值

    MATLAB实现过程:

             采用MATLAB中自带的rice.png作为原始图像。

    close all; clear all; clc
    I = imread('rice.png');
    figure;imshow(I);
    [m,n] = size(I);
    H = imhist(I);  %I的直方图结果
    figure;imhist(I)
    
    %求出每个灰度下的概率
    for a=1:size(H,1)
        P(a,1) = H(a,1)/(m*n);  
    end
    
    % 总体平均值
    u = sum(sum(I))/(m*n); 
    
    %  循环K值,并将每个K值分割后的图像分别保存在Pa和Pb两个矩阵中,
    %  将每种概率下对应的灰度值保存在Ua和Ub中。
    for k=0:255
        i = 1;
        j = 1;
        for b=1:size(H,1) %  b代表灰度级
            if b<=k   %判断灰度小于等于阈值的情况,将其概率和灰度分别保存在Pa和Ua中
                Pa(k+1,i) = P(b,1);
                Ua(k+1,i) = b*H(b,1);
                i = i+1;
            else   %判断灰度大于阈值的情况,将其概率和灰度分别保存在Pb和Ub中
                Pb(k+1,j) = P(b,1);
                Ub(k+1,j) = b*H(b,1);
                j = j+1;
            end
        end
    end
     aa=sum(Pa,2); %分割图像A中的概率,每一行代表一种K值得情况
     bb=sum(Pb,2); %分割图像B中的概率,每一行代表一种K值得情况
     UA = sum(Ua,2)/(size(Ua,1)*size(Ua,2)); %计算A的整体均值
     UB = sum(Ub,2)/(size(Ub,1)*size(Ub,2)); %计算B的整体均值
     
     sigma = aa.*(UA-u).^2 + bb.*(UB-u).^2; %计算总方差
     t = max(sigma);  %求取所有方差中的最大值
     
     %计算最大值方差所对应的K中
     for x=1:256
         if sigma(x) == max(sigma)
             k = x;
         end
     end
     
     %根据所求得的阈值k,将图像分割成二值图像
     for i=1:m
         for j=1:n
             if I(i,j) < k
                 J(i,j) = 0;
             else
                 J(i,j) = 1;
             end
         end
     end
     figure;imshow(J,[])

    处理结果

    原图:

    处理后的图像:

     

    总结,从处理结果上来看该结果效果不好,该阈值不是最佳阈值。具体原因我也没找出来,以后找出来了再进行补充吧。

    在MATLAB中im2bw()函数就是采用这种方法进行处理的,但im2bw()函数的处理结果比上面的结果好。

    展开全文
  • matlab图像处理--预迭代阈值分割

    千次阅读 2018-05-06 11:11:50
    预迭代阈值分割:图像分割关键在于找到最佳阈值,通过迭代方式逼近最佳阈值,是图像分割的有效办法。算法思路: 例如:1,99 取2,50,98都能分割1和99,但是50与1和99差别最大,为最佳阈值。可以看出两个数的中间...
    
    

    预迭代阈值分割:图像分割关键在于找到最佳阈值,通过迭代方式逼近最佳阈值,是图像分割的有效办法。

    算法思路:

        例如:1,99 

        取2,50,98都能分割1和99,但是50与1和99差别最大,为最佳阈值。可以看出两个数的中间值为最佳阈值。哪俩个部分呢?

        例如:1,2,98,99

        我们假设40作为阈值,得到1,2作为A部分,得到98,99作为B部分。A部分均值为1.5,B部分均值为98.5,中间值为50,50与假设值40误差过大,继续取50作于阈值重复上述步骤,得到50为最佳阈值。

        但是,在图像中可不止上述几个数的存在。实际上,不停的划分阈值,其A与B部分的均值必然会不断改变,只能用逼近的方法,即设T1为分割阈值时,A与B部分均值的中间值为T2,若T1与T2的误差很小时,也就是T1约等于T2时,此时的T2或者T1就是最佳阈值。

     程序如下:

    close;clear;clc;
    I=im2double(imread('coins.png'));     %读入图像,转换为双精度类型
    level=0.001;                           %预设两阈值之间的误差
    
    max_I=max(I(:));                      %得到最大灰度值
    min_I=min(I(:));                      %得到最小灰度值
    T1=1/2*(max_I+min_I);                  %假设初始阈值
    [M,N]=size(I);                        %得到图像行列数
    
    A_number=0;                           %初始化A部分总像素值
    B_number=0;                           %初始化B部分总像素值
    A_all=0;                              %初始化A部分总灰度值
    B_all=0;                              %初始化B部分总灰度值
    for i=1:M
        for j=1:N
            if (I(i,j)>=T1)
                A_number=A_number+1;      %A部分总像素值
                A_all=A_all+I(i,j);       %A部分总灰度值
            elseif (I(i,j)<T1)
                B_number=B_number+1;      %A部分总像素值
                B_all=B_all+I(i,j);       %B部分总灰度值
            end
        end
    end
    A_ave=A_all/A_number;                 %A部分灰度均值
    B_ave=B_all/B_number;                 %B部分灰度均值
    T2=1/2*(A_ave+B_ave);                 %A与B灰度均值的中间值,即新阈值
    while (abs(T2-T1)>level)              %判断T1与T2之间的误差绝对值是否大于设定值
        T1=T2;                            %把T2赋给T1,反复重复上述程序,直到T2-T1的绝对值小于设定值为止 
        A_number=0;
        B_number=0;
        A_all=0;
        B_all=0;
        for i=1:M
            for j=1:N
                if (I(i,j)>=T1)
                    A_number=A_number+1;
                    A_all=A_all+I(i,j);
                elseif (I(i,j)<T1)
                    B_number=B_number+1;
                    B_all=B_all+I(i,j);
                end
            end
        end
        A_ave=A_all/A_number;
        B_ave=B_all/B_number;  
        T2=1/2*(A_ave+B_ave); 
    end                                    %T1与T2之间的误差绝对值小于设定值时,跳出循环
    
    T2*255
    J=im2bw(I,T2);                         %把图像转换为二值图,进行阈值为T2的图像分割
    figure(1);
    subplot(121);imshow(I);
    subplot(122);imshow(J);
                  





    展开全文
  • Matlab 直方图阈值分割

    2021-02-08 04:00:17
    最简单的直方图,阈值分割法,直接根据图像的直方图自动获取最佳阈值进行分割! 最简单的直方图,阈值分割法,直接根据图像的直方图自动获取最佳阈值进行分割
  • 2根据阈值Tk将图像分割成目标和背景两部分求出两 部分的平均灰度值和其中 是图像上 点的灰度值 是 点的权重系数 取 点灰度的概率 3 求出新的阈值 4 若结束否则+ 1 转第2步 5 第4步结束后Tk即为最佳阈值
  • 基于MATLAB图像分割算法仿真

    千次阅读 多人点赞 2020-11-09 07:21:44
    而在上述基于点的全局阈值选取方法中,有一个共同的弊病,那就是它们实际上只考虑了直方图提供的灰度级信息,而忽略了图像的空间位置细节,其结果就是它们对于最佳阈值并不是反映在直方图的谷点的情况会束手无策,...

    基于区域的全局阈值选取方法对一幅图像而言,不同的区域,比如说目标区域或背景区域,同一区域内的象素,在位置和灰度级上同时具有较强的一致性和相关性。而在上述基于点的全局阈值选取方法中,有一个共同的弊病,那就是它们实际上只考虑了直方图提供的灰度级信息,而忽略了图像的空间位置细节,其结果就是它们对于最佳阈值并不是反映在直方图的谷点的情况会束手无策,不幸我们通常遇到的很多图像恰恰是这种情况。另一方面,完全不同的两幅图片却可以有相同的直方图,所以即使对于峰谷明显的情况,这些方法也不能保证你得到合理的阈值。于是,人们又提出了很多基于空间信息的阈值化方法。可以说,局部区域的全局阈值选取方法,是基于点的方法,再加上考虑点领域内象素相关性质组合而成,所以某些方法常称为“二维xxx方法”。由于考虑了象素领域的相关性质,因此对噪声有一定抑止作用。

    3 图像切割的实现

     3.1 图像切割实现代码

    clc

    clear all;

    %%%%%%%%%%%%极小值图像切割%%%%%%%%%%%%%%%%%%%%%%%%%

    I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

    figure(1);

    subplot(121),imhist(I); % 观察灰度直方图, 灰度80处有谷,确定阈值T=80

    title('直方图');

    subplot(1,2,2),imshow(I);

    title('原图')

    I1=im2bw(I,80/255); % im2bw函数需要将灰度值转换到[0,1]范围内

    figure(2)

    subplot(3,2,1),imshow(I1);

    title('极小值点阈值切割');

    %%%%%%%%%%%%%%%%%迭代法图像切割%%%%%%%%%%%%%%%%%%%%%%%%

    I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

    [x,y]=size(I);

    a=imhist(I);

    I=double(I);  

    max=1;

    for i=2:x

        if a(max)<a(i)

            max=i;

        end

    end

    min=1;

    for i=2:x

        if a(min)>a(i)

            min=i;

        end

    end      

    z0=max

    z1=min

    T=(z0+z1)/2;                     

    TT=0;

    S0=0; n0=0;

    S1=0; n1=0;

    allow=0.5;                      

    d=abs(T-TT);

    count=0;                       

    while(d>=allow)                

        count=count+1;

        for i=1:x

            for j=1:y

                if (I(i,j)>=T)

                    S0=S0+I(i,j);

                    n0=n0+1;

                end

                if (I(i,j)<T)

                    S1=S1+I(i,j);

                    n1=n1+1;

                end

            end

        end

        T0=S0/n0;

        T1=S1/n1;

        TT=(T0+T1)/2;

        d=abs(T-TT);

        T=TT;

    end

    tmax2=T %tmax2 =77.2717

    Seg=zeros(x,y);

    for i=1:x

        for j=1:y

            if(I(i,j)>=T)

                Seg(i,j)=1;              

            end

        end

    end

    subplot(322),imshow(Seg);

    title('迭代阈值分割1');

    SI=1-Seg;  

    subplot(323),imshow(SI);

    title('迭代阈值分割2');

    %%%%%%%%%%%%%%%%%%最优法切割%%%%%%%%%%%%%%%%%%%%%%%%%%

    I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

    [m,n]=size(I);

    dt = 1;

    d = 0.3;

    I9 = I;

    I9=double(I9);

    while (abs(dt-d)>0.001)

        background = 0;

        object = 0;

        bm = 0;%背景象素数

        om = 0;%前景象素数

        for i=1:m

            for j=1:n

                if (I9(i,j)<d)

                    background = background +I9(i,j);

                    bm = bm+1;

                else

                    object = object + I9(i,j);

                    om = om+1;

                end

            end

        end

        dt = d;

        d = (background/bm+object/om)/2; %假设先验概率相同

    end

    tmax3=d  %tmax3 =79.9102

    for i = 1:m

        for j = 1:n

              if I9(i,j)<d

                  I9(i,j)=0;

              else

                  I9(i,j)=1;

            end

        end

    end

    subplot(324),imshow(I9);

    title('最优阈值法切割');

    %%%%%%%%%%%%%%%%%%%%最大方差法图像切割%%%%%%%%%%%%%%%%%%%%%%%%%%%

    I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

    [r,t]=size(I);

    count=imhist(I);

    n=r*t;

    l=256;

    count=count/n;%各级灰度出现的概率

    for i=2:l

            if count(i)~=0

                st=i-1;

                break

            end

    end

    %以上循环语句实现寻找出现概率不为0的最小灰度值

    for i=l:-1:1

            if count(i)~=0;

                nd=i-1;

                break

            end

    end

    %实现找出出现概率不为0的最大灰度值

    f=count(st+1:nd+1);

    p=st;q=nd-st;%p和q分别是灰度的起始和结束值

    u=0;

    for i=1:q;

            u=u+f(i)*(p+i-1);

            ua(i)=u;

    end

    %计算图像的平均灰度值

    for i=1:q;

            w(i)=sum(f(1:i));

    end

    %计算出选择不同k的时候,A区域的概率

    d=(u*w-ua).^2./(w.*(1-w));%求出不同k值时类间方差

    [y,tp]=max(d);%求出最大方差对应的灰度级

    tmax4=tp % tmax=96

    y1=zeros(r,t);

    for i=1:r

            for j=1:t

                x1(i,j)=double(I(i,j));

            end

    end

    for i=1:r

            for j=1:t

                if (x1(i,j)>tp)

                    y1(i,j)=x1(i,j);

                else

                    y1(i,j)=0;

                end

            end

    end

    %上面一段代码实现分割

    subplot(325),imshow(y1);

    title('最大方差法分割的图像');

    %%%%%%%%%%%%%%%%%%%最大熵法图像切割%%%%%%%%%%%%%%%%%%%%%%%%

    I=imread('C:\Documents and Settings\Administrator\桌面\课程设计题目\2.bmp');

    X=double(I);

    [M,N]=size(I);

    hist=zeros(1,256);

    tic;

    for i=1:1:M

        for j=1:1:N

            fi=X(i,j);

            hist(fi+1)=hist(fi+1)+1;

        end

    end

    i=1:1:256;

    p=zeros(1,256);

    for i=1:1:256

        p(i)=hist(i)/(M*N);

    end

    E1=zeros(1,256);

    E2=zeros(1,256);

    P=zeros(1,256);

    E=zeros(1,256);

     

    for t=1:1:256

        for i=1:1:t

            P(t)=P(t)+p(i);

        end

            if(P(t)>0&&P(t)<1)

               for i=1:1:t

                   E1(t)=E1(t)-(p(i)/P(t))*log(p(i)/P(t)+eps);

               end

               for i=t+1:1:256

                   E2(t)=E2(t)-(p(i)/(1-P(t)))*log(p(i)/(1-P(t))+eps);

               end

           end

           E(t)=E1(t)+E2(t);

    end

    MAX=0.000001;

    for t=68:1:156

        if(E(t)>MAX)

            MAX=E(t);

            th=t;

        end

    end

    tmax5=th  %tmax5=84

    g=zeros(M,N);

    for i=1:1:M

       for j=1:1:N

           if(th<X(i,j))

             X(i,j)=1;

             g(i,j)=X(i,j);

         else X(i,j)=0;

             g(i,j)=X(i,j);

         end

     end

    end

    X=X.*255;

    X=uint8(X);

    subplot(326),imshow(X);

    title('最大熵阈值分割图');

    t_eclapsed=toc;

    展开全文
  • matlab基于遗传算法的最大熵值法的双阈值图像分割

    万次阅读 热门讨论 2016-03-28 16:18:13
    利用最佳直方图熵法(KSW熵法)及传统遗传算法实现灰度图像阈值分割
  • 本文研究了基于Tsallis熵的多阈值图像分割算法,通过利用图像的灰度直方图信息,近似拟合灰度的概率分布函数,然后设定目标函数,目标函数最大化对应的阈值就是最佳阈值,相比传统算法,Tsallis熵的阈值分割方法,...
  • matlab开发-使用水和最佳阈值进行慢性白血病细胞分段。这项工作是对CLL显微血液图像的细胞质和细胞核进行分割
  • 改程序介绍了关于灰度图像阈值、二维最佳直方图熵法及传统遗传算法阈值分割等综合程序
  • 迭代法进行图像分割

    2018-04-24 10:10:10
    使用迭代法进行图像分割Matlab源代码。可根据图像中物体的灰度分布情况,选取一个近似阈值作为初始阈值,然后通过分割图像和修改阈值的迭代过程获得认可的最佳阈值
  • OSTU最佳阈值法二值化原理-matlab和C

    千次阅读 2013-06-05 14:56:04
    觉得这篇介绍OTSU方法挺清楚的。自己又加了一些,希望对初学者有帮助哦~ 转载:... OTSU算法原理简介 对于一幅图像,设当前景与背景的分割阈值为t时,前景点占图像比例为w0,均值为u0,背景点占图像比例
  • 1、描述: 主要是思想是取某个阈值,使得前景和背景两类的类间方差最大,matlab中的graythresh即是以该算法为原理执行的。该算法是日本人Otsu提出的一种动态阈值分割算法。它的主要思想是按照灰度特性将图像划分为...
  • 大津阈值MATLAB自定义程序实现

    千次阅读 2020-06-29 14:08:05
    一、基本原理:使用不同的阈值对图像进行分割为前景和背景,当两者的类间方差最大时,所对应的阈值即为最佳阈值。 二、算法步骤: (1)设置阈值T; (2)利用T将图像分割为C1和C2; (3)计算C1和C2占整幅图像的...
  • 图像MATLAB示例程序.doc

    2020-12-09 14:13:15
    成熟番茄检测 目的检测出图片中已经成熟...自动最佳阈值分割 5.数学形态学运算 6.需要对二值图像作区域标记处理 7.计算重心 对应的代码如下 1载入图像 pic=imread'E:\MATLAB71\work\番茄检测\图片\3.4.jpg'bmp; 2进行滤
  • otsu matlab程序

    热门讨论 2011-05-15 09:42:52
    大津算法(otsu)用于获得图像二值分割最佳阈值。。。
  • matlab代码,基于遗传算法的数字图像处理论文,图片原件,针对传统图像分割方法中基于阈值的图像分割方法中确定最佳阈值的问题,提出了一种基于遗传算法确定最佳阈值进而进行图像分割的方法,虽然其需要较多的运算...
  • ostu二值化matlab代码

    2019-04-22 09:09:04
    ostu图像分割matlab代码,将图像二值化。它的核心思想是:确定一个最佳阈值,使得以此阈值为分界的两类灰度级之间的类间方差达到最大。
  • 在对病灶区域的分割中采用了3种方法做对比,实验结果表明使用灰度阈值选择法得到的图像最为理想,由于灰度阈值选择法中阈值的选定比较繁琐,在该算法基础上结合最佳阈值分割迭代解法较准确地完成了阈值的选定。...
  • 采用了改变传统边缘检测算法的处理顺序,利用最佳阈值分割和轮廓提取相结合的方法实现细胞真实边缘的检测,有效抑制噪声干扰的影响,保证了细胞边缘图像的连续性,完整性和精确定位。
  • NiBlack算法的原理及matlab代码

    千次阅读 2018-03-20 21:48:05
    -Niblack算法在二值化的操作中,用的比较多的就是全局阈值话OTSU(大津法)和局部阈值NiBlack,Niblack方法是一种简单有效的动态阈值分割方法,修改得到最佳参数之后的效果比大津法要好,因为大津法是根据整个图像来...
  • Ostu算法其实就是遍历每个灰度级,判断哪个灰度级的阈值分割的效果最佳,判断效果好坏的指标就是类间方差的大小,类将方差越大效果越好。 计算图像的归一化直方图 ```javascript // grayimg = rgb2gray(img);%将...

空空如也

空空如也

1 2
收藏数 24
精华内容 9
关键字:

matlab图像分割最佳阈值

matlab 订阅