
image_1=rgb2gray(image_1)%灰度化
[m,n]=size(image_1)%计算图片的像素点个数,行列,n是列数,Gray
num=zeros(1,256)%存放各灰度级出现的次数
p=zeros(1,256)%存放各灰度级的比率
image_1=double(image_1)%双精度化
for i=1:m
for j=1:n
num(image_1(i,j)+1)=num(image_1(i,j)+1)+1%统计各灰度级的像素点个数
end
end
for i=1:256
p(i)=num(i)/(m*n)%计算各灰度级出现的比率
end
for i=2:256
if p(i)~=0
st=i+1%实现寻找出现比率不为0的最小灰度值
break
end
end
for i=256:-1:1
if p(i)~=0
nd=i-1%实现找出出现比率不为0的最大灰度值
break
end
end
%以下程序实现利用最小方差和法找出门阈值
w=infth=0
for t=st:nd%最小非零比率灰度值到最大非零比率灰度值
qt1=0qt2=0%前景后景像素点比率
u1=0 u2=0%前景后景均值
v1=0 v2=0%
for i=1:t
qt1=qt1+p(i)
end
for i=1:t
u1=u1+i*p(i)/qt1
end
for i=1:t
v1=v1+((i-u1)^2)*p(i)/qt1
end
for i=t+1:256
qt2=qt2+p(i)
end
for i=t+1:256
u2=u2+i*p(i)/qt2
end
for i=t+1:256
v2=v2+((i-u2)^2)*p(i)/qt2
end
if qt1*v1+qt2*v2<w
th=tw=qt1*v1+qt2*v2
end
end
for i=1:m
for j=1:n
if (image_1(i,j)+1>th)
image_2(i,j)=255
else
image_2(i,j)=0
end
end
end
image_2=uint8(image_2)%读入读出变换
figure,imshow(image_2)%显示二值化后的图片
我给你提供2种方法,一种是直方图阈值法一种是最大类间方差直方图阈值法
用 MATLAB实现直方图阈值法:
I=imread(' c4.jpg ')
I1=rgb2gray(I)
figure
subplot(2,2,1)
imshow(I1)
title(' 灰度图像')
axis([50,250,50,200])
grid on %显示网格线
axis on %显示坐标系
[m,n]=size(I1) %测量图像尺寸参数
GP=zeros(1,256) %预创建存放灰度出现概率的向量
for k=0:255
GP(k+1)=length(find(I1==k))/(m*n) %计算每级灰度出现的概率,将其存入GP中相应位置
end
subplot(2,2,2),bar(0:255,GP,'g') %绘制直方图
title('灰度直方图')
xlabel('灰度值')
ylabel(' 出现概率')
I2=im2bw(I,150/255)
subplot(2,2,3),imshow(I2)
title('阈值150的分割图像')
axis([50,250,50,200])
grid on %显示网格线
axis on %显示坐标系
I3=im2bw(I,200/255) %
subplot(2,2,4),imshow(I3)
title('阈值200的分割图像')
axis([50,250,50,200])
grid on %显示网格线
axis on %显示坐标系
自动阈值法:Otsu法
用MATLAB实现Otsu算法:
clc
clear all
I=imread(' c4.jpg ')
subplot(1,2,1),imshow(I)
title('原始图像')
axis([50,250,50,200])
grid on %显示网格线
axis on %显示坐标系
level=graythresh(I)%确定灰度阈值
BW=im2bw(I,level)
subplot(1,2,2),imshow(BW)
title('Otsu 法阈值分割图像')
axis([50,250,50,200])
grid on %显示网格线
axis on %显示坐标系
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)