【二值化】基于块分析的二值化算法

       前几个月的时候曾经看了一篇论文"Binarization Localization of Text Images Captured on a Mobile Phone Camera" 印度人写的。在这片论文中按循序渐进的思路提出了四种二值化的方法,Block Analysis是在第三阶段,大体思想是基于Niblack算法的,只不过把图像进行分块,然后对每一块计算阈值,T = m + k*v,其中m为这一块的平均灰度值,v是这一块的标准差。当时写的Niblack算法有问题,最近才改正了一下,然后就想到了本文所涉及的算法。matlab程序如下所示:

I = imread('100_1243.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);

该算法的结果比Niblack算法效果要好的多,但是仍然存在很多的噪声。

你可能感兴趣的:(图像处理,二值化)