# Matlab Image Segmentation

1.基于迭代的自动阈值图像分割方法

1.1 全局阈值分割程序

```original_image=imread('test1.png');
gray_image=rgb2gray(original_image);
gray_image=double(gray_image);
t=mean(gray_image(:));
is_done=false;
count=0;%迭代次数
block=gray_image(1:end,1:end);%不分块
while ~is_done
r1=find(gray_image<=t);
r2=find(gray_image>t);
temp1=mean(block(r1));
if isnan(temp1);
temp1=0;
end
temp2=mean(block(r2));
if isnan(temp2)
temp2=0;
end
t_new=(temp1+temp2)/2;
is_done=abs(t_new-t)<1;%差异阈值是1
t=t_new;
count=count+1;
if count>=1000
Error='Error:Cannot find the ideal threshold.'
return
end
end
[m,n]=size(gray_image);
result=zeros(m,n)+255;
result(r1)=0;
% resule(r2)=255;
result=uint8(result);
figure
imshow(result);```

1.2 局部阈值分割程序

```original_image=imread('test1.png');
gray_image=rgb2gray(original_image);
gray_image=double(gray_image);
[m,n]=size(gray_image);
result=zeros(m,n);
block_size=70;%分块大小
for i=1:block_size:m
for j=1:block_size:n
if ((i+block_size)>m)&&((j+block_size)>n)
block=gray_image(i:end,j:end);
elseif ((i+block_size)>m)&&((j+block_size)<=n)
block=gray_image(i:end,j:j+block_size-1);
elseif ((i+block_size)<=m)&&((j+block_size)>n)
block=gray_image(i:i+block_size-1,j:end);
else
block=gray_image(i:i+block_size-1,j:j+block_size-1);
end
t=mean(block(:)); t_org=t; is_done=false; count=0;
while ~is_done
r1=find(block<=t); r2=find(block>t); temp1=mean(block(r1));
if isnan(temp1);
temp1=0;
end
temp2=mean(block(r2));
if isnan(temp2)
temp2=0;
end
t_new=(temp1+temp2)/2; is_done=abs(t_new-t)<1; t=t_new;
count=count+1;
if count>=1000
Error='Error:Cannot find the ideal threshold.'
return
end
end
block(r1)=0;
block(r2)=255;
if ((i+block_size)>m)&&((j+block_size)>n)
result(i:end,j:end)=block;
elseif ((i+block_size)>m)&&((j+block_size)<=n)
result(i:end,j:j+block_size-1)=block;
elseif ((i+block_size)<=m)&&((j+block_size)>n)
result(i:i+block_size-1,j:end)=block;
else
result(i:i+block_size-1,j:j+block_size-1)=block;
end
end
end
resule=uint8(result);
figure
imshow(result);```

2.基于OSTU算法的自动阈值图像分割

[这块我还没有细究…To be continued……] Matlab内置的`graythresh`使用的便是OSTU算法，使得白色像素和黑色像素的类间方差最大。 因为上面测试图像的亮度存在明显的水平差异，所以我写了一个将图像沿水平方向分成几部分分别进行OSTU算法，效果明显又比上面两种方式要好些。

```function [ result ] = partialostu( image,part,isrgb )
%PARTIALOSTU partial image ostu
if isrgb
image=rgb2gray(image);
end
cols=size(image,2);
result=zeros(size(image));
for i=1:part
fstart=floor((i-1)*cols/part)+1;
fend=floor(i*cols/part);
f=image(:,fstart:fend);
t=graythresh(f);
f=im2bw(f,t);
result(:,fstart:fend)=f;
end
end```

111 篇文章27 人订阅

0 条评论

## 相关文章

48570

### （数据科学学习手札40）tensorflow实现LSTM时间序列预测

上一篇中我们较为详细地铺垫了关于RNN及其变种LSTM的一些基本知识，也提到了LSTM在时间序列预测上优越的性能，本篇就将对如何利用tensorflow，在...

59340

32670

39880

10020

38790

### TensorFlow从0到1 - 7 - TensorFlow线性回归的参数溢出之坑

? 上一篇 6 解锁梯度下降算法解释清楚了学习率（learning rate）。本篇基于对梯度下降算法和学习率的理解，去填下之前在线性回归中发现的一个坑。 ...

39570

16250

30250