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