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算法处理的阈值的二值图');
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
