智能车fw日记【4】

阈值方法

大津

今天看了一些二值化阈值方面的知识,起因是想看一下梯度阈值,没想到一天就过去了。。
二值化方法可分为:全局二值化和局部自适应二值化,实验室用的是大津(全局,最大类间方差法),中心思想是阈值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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值