基本全局阈值算法:
1.设置初始灰度值T,可设为图像的平均灰度值
2.用T把图像分成两部分G1和G2,G1的灰度值大于T,G2的灰度值小于等于T
3.计算G1,G2的平均灰度值m1,m2
4.更新T=(m1+m2)/2
5.重复2~4直到T的变化量小于某个很小的阈值
Matlab代码:
clc,clear
f1 = imread('blobz1.png');
f2 = imread('blobz2.png');
figure;
subplot(1,2,1),imhist(f1),title('原图像(光照均匀)');
subplot(1,2,2),imhist(f2),title('原图像(光照不均匀)');
figure;
subplot(1,2,1),imshow(f1),title('光照均匀');
subplot(1,2,2),imshow(f2),title('光照不均匀');
[h1,w1] = size(f1);
[h2,w2] = size(f2);
delta_T = 1;
T_last = sum(f1(:))/(h1*w1); % 用图像的平均灰度作为初始值
T_new = 125;
while abs(T_new - T_last) > delta_T
g1 = f1(logical(f1>T_last)); % 找出阈值以上的像素
c1 = sum(sum(logical(f1>T_last)));
m1 = sum(sum(g1))/c1; % 计算g1的平均灰度值
g2 = f1(logical(f1<=T_last)); % 找出阈值以下的像素
c2 = sum(sum(logical(f1<=T_last)));
m2 = sum(sum(g2))/c2;
T_last = T_new;
T_new = (m1+m2)/2; % 更新阈值
end
T_last = floor(T_last)
f1(logical(f1>T_last)) = 255; % 把背景置为最亮
f1 = uint8(f1);
T_last = sum(sum(f2))/(h2*w2); % 用图像的平均灰度作为初始值
T_new = 150;
while abs(T_new - T_last) > delta_T
g1 = f2(logical(f2>T_last)); % 找出阈值以上的像素
c1 = sum(sum(logical(f2>T_last)));
m1 = sum(sum(g1))/c1;
g2 = f2(logical(f2<=T_last)); % 找出阈值以下的像素
c2 = sum(sum(logical(f2<=T_last)));
m2 = sum(sum(g2))/c2; % 计算g2的平均灰度值
T_last = T_new;
T_new = (m1+m2)/2; % 更新阈值
end
T_last = floor(T_last)
f2(logical(f2>T_last)) = 255; % 把背景置为最亮
f2 = uint8(f2);
figure;
subplot(1,2,1),imshow(f1),title('光照均匀');
subplot(1,2,2),imshow(f2),title('光照不均匀');
测试图像:
运行结果: