METLAB学习笔记7-最大方差自动取阈值

2018.5.10

%%转自:https://blog.csdn.net/zhangfuliang123/article/details/70821455  %%

在此补充对平均灰度的求法

       按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

       对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均灰度记为μ,类间方差记为g。并且假设图像的背景较暗,并且图像的大小为M×N,图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:

u0=(前景像素点对应的灰度值 / 前景像素点的个数)

u1=(背景像素点对应的灰度值 / 前景像素点的个数)

ω0=N0/ M×N (1)

ω1=N1/ M×N (2)

N0+N1=M×N (3)

ω0+ω1=1 (4)

μ=ω0*μ0+ω1*μ1 (5)

g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)

将式(5)代入式(6),得到等价公式: g=ω0ω1(μ0-μ1)^2 (7)

采用遍历的方法得到使类间方差最大的阈值T,即为所求。

请注意:这个地方为什么说用遍历方法呢,我们的w0,w1,u0,u1应该都是确定值啊,我看了下MATLAB中的otsuthresh函数的源码,才找到答案,以下是函数源码的部分截图:


原来,这个函数是以把一个一个的像素点来当做阈值进行分析求g,以此遍历求得使g最大的阈值T。


METLAB中帮我们封装好了此函数,附上代码以及效果截图:

%%读取视频中前15个帧 另存并显示
clc;
vidObj = VideoReader('traffic.avi');
nFrames = vidObj.NumberOfFrames;

for k=1:40 % 读取前15帧
    frame = read(vidObj, k);  
    frame = rgb2gray(frame); %彩色图像灰度化
    level = graythresh(frame);  %使用最大类间方差法找到图片的阈值
    frame = im2bw(frame, level); %使用阈值变换法 把灰度化图像变为二值化图像
    imshow(frame); %显示帧
    imwrite(frame , strcat('C:\frame\',num2str(k),'.jpg'),'jpg'); %保存帧 
end    
   
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值