subplot(1,3,1);imshow(I);title('original');
subplot(1,3,2);imshow(imagSW);title('kittler binary'); subplot(1,3,3);imshow(bw1); title('thresh=130'); 结果:
Niblack二值化算法:
Niblack二值化算法是比较简单的局部阈值方法,阈值的计算公式是T = m + k*v,其中m为以该像素点为中心的区域的平均灰度值,v是该区域的标准差,k是一个系数。matlab程序如下:
I = imread(' beauty_yellowflowers.jpg '); I = rgb2gray(I);
w = 2;% max = 0;
min = 0; [m,n] = size(I); T = zeros(m ,n ); %
for i = (w + 1):(m - w) for j = (w + 1):(n - w) sum = 0; for k = -w:w for l = -w:w
sum = sum + uint32(I(i + k,j + l)); end end
average = double(sum) /((2*w+1)*(2*w+1)); s = 0;
for k = -w:w for l = -w:w
s = s + (uint32(I(i + k,j average)*(uint32(I(i + k,j + l)) - average); end end
s= sqrt(double(s)/((2*w+1)*(2*w+1)));
+ l)) -
T(i,j) = average + 0.2*s; end end for i = 1:m for j = 1:n
if I(i,j) > T(i,j) I(i,j) = uint8(255); else
I(i,j) = uint8(0); end end end imshow(I);
此种算法速度很慢,一直都没等到结果,也有可能是程序中有死循环,,费解
改进的算法如下:(也挺费时间的,效果不好) I = imread(' beauty_yellowflowers.jpg ');
I = rgb2gray(I); [m,n] = size(I);
block = 10;
ver = floor(m/block); hor = floor(n/block); T = zeros(m,n); for b_ver = 1:block for b_hor = 1: block
% T((ver * (b_ver - 1)+1) : (ver *b_ver),(hor *(b_hor - 1) + 1):(hor*b_hor)) = otsu(I((ver * (b_ver - 1)+1) : (ver *b_ver),(hor *(b_hor - 1) + 1):(hor*b_hor))); t = 0;
for i = (ver * (b_ver - 1)+1) : (ver * b_ver) for j = (hor * (b_hor - 1) + 1):(hor * b_hor) t = t + uint32(I(i,j)); end end
t = double(t)/(ver * hor); std_deviation = 0;
for i = (ver * (b_ver - 1)+1) : (ver * b_ver) for j = (hor * (b_hor - 1) + 1):(hor * b_hor)
std_deviation = std_deviation + (uint32(I(i,j)) - t)*(uint32(I(i,j)) - t);
end end
std_deviation = sqrt(double(std_deviation)/(ver*hor));
thr = t + 0.2*std_deviation;
for i = (ver * (b_ver - 1)+1) : (ver * b_ver) for j = (hor * (b_hor - 1) + 1):(hor * b_hor) if I(i,j) > uint8(floor(thr)) T(i,j) = 255; else T(i,j) = 0; end end end end end imshow(T); 效果(不怎么好):