Otus算法(一维)

 

myOtsu.m

function img2 = myOtsu(img, type)
%大津算法
%维度:一维
%输入:img为引入的图片,type为想要保留的细节的颜色
%输出:二值图0和1
%作者:钟海潇原创
%学校:仲恺
    [M,N] = size(img);
    zhi = zeros(1,256);
    for i =1:256
        %因为matlab存数组是一列一列的存的,find函数是寻找对应灰度值的下标
        %矩阵的话就是从上到下,一列一列来数
        zhi(i) = length(find(img == i - 1));
    end
    g = 0;
    T = 0;
    for tmp_T =2:256
        N0 = length(find(img < tmp_T));
        N1 = length(find(img >= tmp_T));
        w0 = N0./(M.*N);
        w1 = N1./(M.*N);
        %计算小于T和大于T的平均灰度值
        u0 = 0;
        u1 = 0; 
        for j =1:(tmp_T-1)
            u0 = u0 + (j-1).*zhi(j);
        end
        u0 = u0./N0;
        for j =tmp_T:256
            u1 = u1 + (j-1).*zhi(j);
        end
        u1 = u1./N1;
        tmp_g = w0*w1*(u0-u1).^2;
        %g若更大则更新并保存T
        if tmp_g > g
            g = tmp_g;
            T = tmp_T;
        end
    end
    img2 = img;
    switch type
        case 'while'
            img2(img2 < T) = 0;
            img2(img2 >= T) = 1;
        case 'black'
            img2(img2 < T) = 1;
            img2(img2 >= T) = 0;
    end
end

 

T1.m

clc;
clear all;
img1 = imread('EXP6-1.bmp');
img2 = imread('EXP6-2.tif');

figure(1);
subplot(221);imshow(img1);title('原图-1');

img1_1 = myOtsu(img1, 'while');
subplot(222);imshow(img1_1.*255);title('原图-1使用otsu算法处理的阈值的二值图');

subplot(223);imshow(img2);title('原图-2');

img2_1 = myOtsu(img2, 'black');
subplot(224);imshow(img2_1.*255);title('原图-2使用otsu算法处理的阈值的二值图');


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部