对于简单的灰度图像,如果目标与背景的灰度存在一定的差异,那么可以用阈值来提取目标。关键是确定阈值,常用方法有:

模态法、P参数法、可变阈值法、大津法和迭代逼近法等。

模态法:

取直方图的波谷作为阈值。适用于目标与背景灰度差异较大,目标与背景的直方图各有一个波峰的灰度图像。

如果直方图凹凸较激烈,寻找波谷存在困难,可以用领域点平均化处理使直方图相对平滑。

P参数法:

当目标占图像的面积比例已知,且目标最小灰度值大于背景最大灰度值时,可采用P参数法。具体做法是,如果目标灰度接近白色,则在

直方图右侧开始累计像素,直到累计像素占总像素数比例为P时,将当前的灰度作为阈值(否则从左侧开始累计)。

例如下图,月亮所占比列为0.45,它最低灰度与背景灰度稍有重合,阈值确定为75,最终基本提取出目标。

可变阈值法:

当图像背景灰度多变时,可以为图像不同部位设置不同的阈值,这样可以很好地去除干扰。

例如提取下图的蒲公英,图像上部光照多,主要为蒲公英的羽毛,下部光照少,且主要为茎,对上中下采取不同阈值的提取效果会好很多。

大津法:

大津法的应用最广泛,有很好的自适应阈值。适用于批量图像提取或者动态灰度图像提取(然而事实证明,当大津遇到反光时,干扰也会很严重)。

大津法的原理如下:

设T为分割阈值,由此划分出区域记为R1和R2。

R1占图像总像素的比例为θ1,R2占图像总像素的比例为θ2。

图像的平均灰度值为μ0,R1的平均灰度为μ1,R2的平均灰度为μ2。

显然有:

μ0=θ1*μ1+θ2*μ2

如果阈值选得恰当,则R1与R2的灰度差应该较大,那么μ1与μ0、μ2与μ0的差的绝对值也就较大。

定义类间方差,来反应灰度差大小:

σ2=θ1(μ1-μ0)2+θ2(μ2-μ0)2

对于每个选定的阈值T,都有σ对应,而最大σ的阈值T则是最佳阈值。

迭代逼近法:

此法是大津法的简化版,具体步骤如下:

取最大灰度与最小灰度平均值(也可以是图像平均灰度)为初始阈值T,由此得两个区域为R1和R2

计算R1和R2的灰度均值μ1、μ2

选择新阈值T=(μ1+μ2)/2,重复以上步骤,直到T不再变化或变化在一定范围内。

采用该法的效果如图所示,大概只迭代了五次左右:

但是,该法确定的阈值很粗糙,往往与最佳阈值会有较大偏差,比如提取之前的月亮,表现得就并不是很好了:

以上大部分matlab仿真测试代码罗列如下:

%p参数法确定阈值

function thres=pthres(file,p)

imga=imread(file);%灰度化

imga=rgb2gray(imga);%获取大小

[sizex,sizey]=size(imga);%直方图

histogram= zeros(256,1);for i=1:sizexfor j=1:sizey

histogram(imga(i,j)+1)=histogram(imga(i,j)+1)+1;

end

end%累计像素

pixels_cnt=0;

thres=256;while(pixels_cnt

pixels_cnt=pixels_cnt+histogram(thres);

thres=thres-1;

end%根据阈值二值化

mybw=imbinarize(imga,(thres-1)/255);

subplot(1,2,1);

imshow(imga);

title('原图');

subplot(1,2,2);

imshow(mybw);

title('p参数法二值化');

end

%多阈值分割实例

imga=imread('multi_thres.jpg');

imga=rgb2gray(imga);

single= imbinarize(a,85/255);

multi(250:300,:) = imbinarize(a(250:300,:),85/255);

multi(150:250,:) = imbinarize(a(150:250,:),150/255);

multi(1:150,:) = imbinarize(a(1:150,:),170/255);

subplot(1,3,1);

imshow(imga);

title('原图');

subplot(1,3,2);

imshow(single);

title('单阈值处理');

subplot(1,3,3);

imshow(multi);

title('多阈值处理');

%迭代逼近法

function thres=iterator(file)

imga=imread(file);%灰度化

imga=rgb2gray(imga);%获取大小

[sizex,sizey]=size(imga);%直方图与总灰度统计

gray_sum=0;

histogram= zeros(256,1);for i=1:sizexfor j=1:sizey

histogram(imga(i,j)+1)=histogram(imga(i,j)+1)+1;

gray_sum= gray_sum+double(imga(i,j)+1);

end

end%初始阈值

thres=gray_sum/(sizex*sizey);

old_thres=0;%迭代逼近while(abs(thres-old_thres)>1)

disp(thres);

u1=0;u2=0;

cnt1=0;cnt2=0;for i=1:thres

u1=u1+histogram(i)*i; %统计R1区域平均灰度

cnt1=cnt1+histogram(i);

endfor i=256:-1:thres

u2=u2+histogram(i)*i; %统计R2区域平均灰度

cnt2=cnt2+histogram(i);

end

u1=u1/cnt1;

u2=u2/cnt2;

old_thres=thres;

thres=(u1+u2)/2; %新阈值

end

mybw=imbinarize(imga,(thres-1)/256);

subplot(1,2,1);

imshow(imga);

title('原图');

subplot(1,2,2);

imshow(mybw);

title('迭代逼近法二值化');

end

matlab确定灰度阈值T,基于阈值的灰度图像提取法相关推荐

  1. 【MATLAB图像处理实用案例详解(3)】—— 基于阈值分割的车牌定位识别

    目录 一.背景意义 二.理论基础 2.1 车牌区域分割: 2.2 车牌定位及裁剪 三.算法流程 3.1 车牌图像处理 3.1.1 图像灰度化 3.1.2 图像二值化 3.1.3 图像边缘检测 3.1. ...

  2. Matlab底层算法实现基于动态阈值的自动白平衡算法

    公式 原文链接 Matlab源码 %%%%%%%%%%%%%%%基于动态阈值的自动白平衡算法实现 clc; image=imread('D:\lena1.png'); %分离出RGB三通道矩阵 r_m ...

  3. 【CV】基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  4. 基于阈值处理的图像分割算法!

    图像处理 Author:louwill Machine Learning Lab 基于阈值的图像分割因其处理直观.实现简单和计算速度快,是一种更为常用的传统图像分割算法.本文基于图像灰度阈值处理的基本 ...

  5. 基于阈值方法的大津法(OTSU算法)---图像分割

    基于阈值方法的大津法(OTSU算法)---图像分割 主要分为三部分去实现: 1.基本概念 大津法:属于阈值分割的范畴.阈值分割方法:利用图像中要提取的目标物体和背景在灰度上的差异,选择一个合适的阈值, ...

  6. matlab函数im2bw_图像分割之阈值分割(matlab)(转载)

    转载自:https://blog.csdn.net/weixin_39824223/article/details/112249214 matlab函数im2bw_图像分割之阈值分割(matlab) ...

  7. 图像分割---基于阈值处理的基本方法

    文章目录 前言 一.基于阈值的分割方法 1.1 固定阈值法--直方图双峰法 1.2 迭代阈值图像分割 1.3 自适应阈值图像分割 1.3.1 常规方法 1.3.2 大津法(OTSU) 参考文献: 前言 ...

  8. [Python从零到壹] 六十.图像识别及经典案例篇之基于阈值及边缘检测的图像分割

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  9. 图像处理之基于阈值模糊

    图像处理之基于阈值模糊 算法思想: 实现一个高斯卷积模糊但是只运用与周围的像素值与中心像素值差值小于阈值.两个 像素值之间的距离计算可以选用向量距离即曼哈顿距离或者欧几里德距离.高斯模糊 采用先XY方 ...

最新文章

  1. jchdl - RTL实例 - And
  2. linux 查找大文件
  3. 自定义控件:侧拉删除
  4. 【图像处理】MATLAB:退化函数及多种复原方法
  5. js+css立体旋转
  6. 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
  7. 何为父组件子组件、props作用、slot插槽
  8. [置顶] 程序员成长路上的团队修炼之道
  9. Nginx 优秀的核心架构设计揭秘,让你搞懂高并发之道
  10. 基于MongoDB与NodeJS构建物联网系统
  11. 整理软件测试分析资料
  12. python 学习(八—1) 项目:生成随机的测试试卷文件
  13. chrome 查看日志
  14. telegram自动发信息_zabbix调用telegram机器人发送报警消息
  15. Apollo-阿波罗配置中心详细使用教程
  16. [YLANDS][艾兰岛][校长组件]键值对数组(字典)
  17. 计算机视觉与脑电数据等应用于驾驶员的疲劳状态检测综述
  18. 《深入理解Java虚拟机》知识点目录
  19. Taskade for Mac(mac任务清单管理器)
  20. 为什么将指令cache和数据cache相分离?

热门文章

  1. Reabble – 出色的 Kindle RSS 在线阅读器
  2. Qt每天一个小技巧之setProperty 设置属性功能
  3. webaudio_WebAudio Deep Note,第1部分:简介
  4. 火车车次信息管理试题讲解
  5. 如何一键批量下载Iconfont图标
  6. 什么是网关,网关是什么意思?,怎么理解网关?
  7. 微信公众号开发-php-sdk接口
  8. 算法面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
  9. C++程序设计:圆桌问题
  10. 小满节气第二期|小满是什么季节?这些小满海报来告诉你