本篇文章主要给出Niblack动态二值化代码,鉴于自身水平所限,如有错误,欢迎批评指正。(欢迎进Q群交流:874653199)
二值化结果:
matlab代码:
%Niblack算法
clc;
clear;
rawImg=imread('E:\2_光学测量\21_格雷码重建\3_数据\graycode\01\15.bmp');
srcImg = rawImg;
if(length(size(srcImg))>2)
srcImg=rgb2gray(srcImg);
end
w03 =35;%
max03 = 0;
min03 = 0;
[m,n] = size(srcImg);
T03 = zeros(m ,n );
%
for i = (w03 + 1):(m - w03)
for j = (w03 + 1):(n - w03)
sum = 0;
for k = -w03:w03
for l = -w03:w03
sum = sum + uint32(srcImg(i + k,j + l));
end
end
average = double(sum) /((2*w03+1)*(2*w03+1));
s = 0;
for k = -w03:w03
for l = -w03:w03
s = s + (uint32(srcImg(i + k,j + l)) - average)*(uint32(srcImg(i + k,j + l)) - average);
end
end
s= sqrt(double(s)/((2*w03+1)*(2*w03+1)));
T03(i,j) = average + 0.2*s;
end
end
for i = 1:m
for j = 1:n
if srcImg(i,j) > T03(i,j)
srcImg(i,j) = uint8(255);
else
srcImg(i,j) = uint8(0);
end
end
end
t=graythresh(srcImg);
bwImages =imbinarize(rawImg,t);%OTSU二值化;
subplot(1,3,1);imshow(rawImg); title('原图像')
subplot(1,3,2);imshow(srcImg); title('Niblack算法')
subplot(1,3,3);imshow(bwImages); title('OTSU算法')