阈值方法
大津
今天看了一些二值化阈值方面的知识,起因是想看一下梯度阈值,没想到一天就过去了。。
二值化方法可分为:全局二值化和局部自适应二值化,实验室用的是大津(全局,最大类间方差法),中心思想是阈值T应使目标与背景两类的类间方差最大(ctrl + c的),按我的理解是先创建灰度数组,并统计每个灰度在图中出现的频率,最后一个一个灰度值进行类方差计算(如下图,u是整张图的灰度和),最大的方差时的灰度值即为阈值。至于类方差为什么这样算俺也不知道。。
一张反光的图的效果
大津在matlab里有库函数
I=imread('图片路径'); %如果是彩图还要加rgb2gray灰度化
figure(1);
imshow(I);
a = I;
level = graythresh(a);
a=im2bw(a,level);
figure(2);
imshow(a);
kittler
另一种全局阈值:Kittler算法,速度很快,只要一个两重循环,可惜效果不是很好好
中心思想是计算整幅图像的梯度灰度的平均值,以此平均值做为阈值(ctrl + c)
看代码是计算了每个点水平和垂直方向两个梯度进行比较,然后取其中的max,再记录梯度和以及梯度与灰度值乘积的和,最后两者相除得出一个平均值
I=imread('图片路径');
a=rgb2gray(I);
[hh,ww] = size(a);
figure(1);
imshow(a);
a = double(a);
b = zeros(hh,ww);
sumGrads = 0;
sumGrayGrads = 0;
for i = 2:hh-1
for j=2:ww-1
Grads = max(abs(a(i - 1,j)-a(i + 1,j)),abs(a(i,j - 1)-a(i,j + 1)));
sumGrads = sumGrads + Grads;
sumGrayGrads = sumGrayGrads + Grads*a(i,j);
end
end
threshold = sumGrayGrads/sumGrads;
for i = 1:hh
for j=1:ww
if(a(i,j)>threshold)
b(i,j) = 255;
else
b(i,j) = 0;
end
end
end
figure(2);
imshow(b);
看起来效果差了很多。看别人的博客说这个算法适合应用在图像质量不错的环境,看来石锤了。
矩阵二值化算法
最后是一个局部的二值化,从一个大佬那里看到的,基本思想是扫描每一个像素周围的像素点(矩形),取这个矩形内的所有像素点的灰度值的平均值作为该点的阈值(算是根据点周围的信息来确定阈值)。(矩形的选取有个公式)
最后,对于图像的平滑区域,很容易出现噪点(因为像素点周围的像素灰度值都差不多,阈值会在该店灰度值上下摆动),所以在算出的阈值乘上一个参数if(a(i,j)<(b(i,j)*0.80)),降低平滑区域噪点产生的同时对目标的特征提取没有多大影响(本来黑色的点灰度值就很低了,不在乎阈值低一些)
I=imread('图片路径');
a=rgb2gray(I);
[hh,ww] = size(a);
figure(1);
imshow(a);
a = double(a);
b = zeros(hh,ww);
height = sqrt(hh/ww*(hh+ww));%创建矩阵
width = ww/hh*height;
for h = 1:hh
for w = 1:ww
h1 = h-floor(height/2);
h2 = h+floor(height/2);
w1 = w-floor(width/2);
w2 = w+floor(width/2);
if(h1 < 1)
h1 = 1;
end
if(h2 > hh)
h2 = hh;
end
if(w1 < 1)
w1 = 1;
end
if(w2 > ww)
w2 = ww;
end
avg = 0;
for i = h1:h2
for j = w1:w2
avg = avg + a(i,j);
end
end
avg = avg/((h2-h1)*(w2-w1));
b(h,w) = avg;
end
end
for i = 1:hh
for j = 1:ww
if(a(i,j)<(b(i,j)*0.80))
b(i,j) = 0;
else
b(i,j) = 255;
end
end
end
figure(2);
imshow(b);
大津就炸了
很可惜这种方法对反光图的效果还是不行
感觉这种方法主要应用在提出骨架和特征方面,对光线不太好的图大津还是yyds
以后再看看还有什么二值化的方法吧。。。
参考:https://blog.csdn.net/lj501886285/article/details/52425157
https://www.cnblogs.com/zhangjiansheng/p/6714498.html
https://blog.csdn.net/mutex86/article/details/9169303