% 分块Otsu
clear all; % 清除所有变量 在function里不能使用
% close all; % 关闭所有figure 在function里不能使用
clc;
[filename,pathname]=uigetfile({'*.jpg;*.bmp;*.tif;*.png;*.gif','All Image Files';'*.*','All Files'});
tic;
t1 = clock;
% 读取图像
I = imread([pathname,filename]);
% I = imread('F:\matlab2016\bin\pic\lena.jpg');
figure;
subplot(2,2,1);
imshow(I),title('原图');
% 图像灰度化
numel = numel(size(I));
if numel>2
I_gray = rgb2gray(I);
else
I_gray = I;
end
subplot(2,2,2);
imshow(I_gray),title('灰度图');
% 转为双精度
I_double = double(I_gray);
% 图像大小
[m, n] = size(I_gray);
% 图像块大小 k*k
k = 80;
z1 = ceil(m/k);
z2 = ceil(n/k);
for i = 1:z1
for j = 1:z2
if i*k>m
e1 = m;
else
e1 = k*i;
end
if j*k>n
e2 = n;
else
e2 = k*j;
end
% 分块阈值
T = Otsu_Block_T(I_gray(k*(i-1)+1:e1,k*(j-1)+1:e2));
for x = k*(i-1)+1:e1
for y = k*(j-1)+1:e2
if I_gray(x,y)>T
I_gray(x,y)=255;
else
I_gray(x,y)=0;
end
end
end
end
end
subplot(2,2,3);
imshow(I_gray),title('分块Otsu阈值分割');
disp(['etime程序总运行时间:',num2str(etime(clock,t1))]);