• 大小: 225KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-16
  • 语言: Matlab
  • 标签: 图像分割  

资源简介

多阈值分割,图像处理,最大内间方差算法otsu的,本程序用的是三个阈值的分割,matlab编写的

资源截图

代码片段和文件信息

%-----------------------------基于最大内间方差思想的多阈值图像分割算法-------------------------
tic
clc
clear all;
close all;
img = imread(‘lenna.bmp‘);
I_gray=rgb2gray(img);%将三原色彩色图像转化为灰度图像
I_double=double(I_gray);    %转化为双精度,因为大多数的函数和操作都是基于double的
[widlen]=size(I_gray);     %wid为行数,len为列数b
colorlevel=256;     %灰度级
hist=zeros(colorlevel1);   %直方图,256×1的0矩阵
threshold_num=3;%代表有三个阈值
threshould_vector=zeros(threshold_num1);%初始化一个向量数组用于存储阈值
W=zeros(threshold_num+11);%用于存储每个部分的w的值
miu=zeros(threshold_num+11);%用于存储阈值分割出来的图像各处的平均值
best_threshold=zeros(1threshold_num);%用于保存最好的阈值
% file_ceache = fopen(‘test.txt‘‘w‘);%用于存储命令行输出的数据
%计算直方图,统计灰度值的个数
for i=1:wid
    for j=1:len
        m=I_gray(ij)+1;    %因为灰度为0-255所以+1
        hist(m)=hist(m)+1;
    end
end
%直方图归一化
hist=hist/(wid*len);
%miuT为总的平均灰度,hist[m]代表像素值为m的点个数
miuT=0;
for m=1:colorlevel
    miuT=miuT+(m-1)*hist(m);
end
max_fangcha=0;  %初始方差大小
%---------------------程序的开始-----------------------------------
for t1=1:colorlevel-2
    for t2=t1+1:colorlevel-1
        for t3=t2+1:colorlevel
            miu=zeros(threshold_num+11);
            W=zeros(threshold_num+11);
            %计算第一个目标所占的比例
            for m=1:t1
                W(1)=W(1)+hist(m);
            end
            %计算第二个目标所占的比例
            for m=t1+1:t2
                W(2)=W(2)+hist(m);
            end
            %计算第三个目标所占的比例
            for m=t2+1:t3
                W(3)=W(3)+hist(m);
            end
            %计算第四个目标所占的比例
            W(4)=1-W(1)-W(2)-W(3);
            %             fprintf(file_ceache‘%d---%d---%d目标W的值:%f%f%f%f\n‘t1t2t3W(1)W(2)W(3)W(4));
            %计算目标的平均灰度
            for m=1:colorlevel
                if(m<=t1)
                    miu(1)=miu(1)+(m-1)*hist(m);
                else if(m>t1&&m<=t2)
                        miu(2)=miu(2)+(m-1)*hist(m);
                    else if(m>t2&&m<=t3)
                            miu(3)=miu(3)+(m-1)*hist(m);
                        else
                            miu(4)=miu(4)+(m-1)*hist(m);
                        end
                    end
                end
            end
            %    fprintf(file_ceache‘%d---%d---%d中的miu的值:%f%f%f%f\n‘t1t2t3miu(1)miu(2)miu(3)miu(4));
            %            fclose(file_ceache);
            %修改miu的值
            for m=1:threshold_num+1
                %由于不可避免会出现0的值,故采用下面方案处理
                if W(m)==0
                    W(m)=0;
                    miu(m)=0;
                else
                    miu(m)=miu(m)/W(m);
                end
            end
            % fprintf(‘%d---%d---%d中的miu的值:%f%f%f%f\n‘t1t2t3miu(1)miu(2)miu(3)miu(4));
            %    miu=miu./W;
            %计算方差
            fangcha(t1t2t3)=0;
            for i=1:threshold_num+1
                fangcha(t1t2t3)=fangcha(t1t2t3)+W(i)*((miu(i)-miuT).^2);
            end
            if(fangcha(t1t2t3)>max_fangcha)
                max_fangcha=fangcha(t1

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     786486  2009-11-03 15:15  阈值分割\lenna.bmp

     文件       4704  2018-03-08 11:56  阈值分割\multi_Otsu.m

     目录          0  2018-03-16 11:22  阈值分割

----------- ---------  ---------- -----  ----

               791190                    3


评论

共有 条评论