Matlab 迭代法计算灰值图像的level
Matlab中,已知函数im2bw(X,Level),默认level为0.5。这里level为阈值,其含义是:
第Xij个像素,利用利用二值化处理时,level=T为临界值。
在确定T的大小时,可以用迭代法确定:
1、首先选择图像的平均灰度值作为初始阈值T0=108
2、根据初始阈值,将图像分为两部分,C1部分灰度值大于T,C2部分灰度值小于T
3、计算C1部分和C2部分的平均灰度值:
4、再计算新的阈值:
5、重复迭代第2-4步,当Ti+1和Ti的差几乎为0时,停止迭代,此时T为最佳阈值。
代码如下:
clc
clear all
close all
I=imread('0.jpg');
B=rgb2gray(I);
B=double(B);
mean(B(:))
[r,c]=size(B);
T(1)=108;
T(2)=10;
a=0;
b=0;
su1=0;
su2=0;
for k=2:1000
if( T(k)-T(k-1)>0.0001 | T(k)-T(k-1) <(-0.0001))
for i=1:r
for j=1:c
if B(i,j)>T(k)
su1=B(i,j)+su1;
a=a+1;
else
su2=B(i,j)+su2;
b=b+1;
end
end
end
u1=su1/a;
u2=su2/b;
T(k+1)=(u1+u2)/2;
else T(k)
end
end
t=T(800)/255
figure;imshow(I);
B=im2bw(I,t);
figure;imshow(B);
效果如图:
此时level=0.4869
在具体应用过程中,根据图像的不同,可以修改level大小,如果图像色彩比较丰富,内容饱满,level值可以设置大点,靠近1;如果色彩单一,内容较少,则level值设置靠近0。
在matlab中,还可以使用imbinarize函数,默认情况下,imbinarize
使用 Otsu 方法,该方法选择特定阈值来最小化阈值化的黑白像素的类内方差。