4、im2bw 和 imbinarize 的区别与图像分割的综合应用

article/2025/10/5 19:39:32

1. im2bw 和 imbinarize 的区别

将图片转换为二值图有两个函数,分别为:

bw = imbinarize(g); 

bw = im2bw(g);

matlab2018 中建议用 imbinarize 来将图片转换为二值图,其参数必须为灰度图

matlab2016 中,只有 im2bw 函数,其参数可以是灰度图或 RGB 图

从上面两句话可以看出二者的主要区别,两者接收的参数类型不同

  • matlab2016 中可以用 im2bw 直接将 RGB 图像转换为二值图
  • matlab2018 中只能先将 RGB 图片转换为灰度图(用 rgb2gray() 函数),再用 imbinarize 转换为二值图。

两个函数都是将图片转换为二值图,除了参数的类型不同,两个函数都可再传入一个 [0,1] 的阈值 level,即:

bw = im2bw(g, level);

bw = imbinarize(g, level);

阈值 level 的作用为:

  • 用值 1 (白色)替换输入图像中亮度大于 level 比例的所有像素
  • 用值 0 (黑色)替换所有其他像素。

im2bwlevel 省略时,默认为 0.5

imbinzrize 的阈值默认值我没找到(好像是用某种算法算出的,知道的可以在评论区交流一下),但是可以自己来指定,当指定为 0.5 时候 imbinarize(g, 0.5)im2bw(g) 的效果是一样的。


在不为 imbinarize 指定阈值和指定时的比较见下图:
在这里插入图片描述
代码如下:

clear,clc,close all;
f=imread('eye.jpg');
g=rgb2gray(f);
bw1=imbinarize(g);
bw2=imbinarize(g,0.5);
subplot(1,2,1),imshow(bw1),title('默认阈值');
subplot(1,2,2),imshow(bw2),title('指定阈值');

2. 图像分割的综合应用

目的:截取图片中的眼睛
在这里插入图片描述
步骤:

  1. 先转换为二值图,因为单纯的处理二值图更为简便

    为了使图片转换为二值图,使用 imbinarize 函数,其中的参数必须为二维的灰度图:

    根据比较,为了分割出人物的眼睛,可利用 im2bw(g)imbinarize(g, 0.5) 转换为二值图,由于是使用matlab2018版本,这里选择使用 imbinarize(g, 0.5)该步代码和效果为:

    clear,clc,close all;
    f=imread('eye.jpg');
    g=rgb2gray(f);
    bw=imbinarize(g,0.5);
    imshow(bw);
    

    在这里插入图片描述

  2. 对二值图bw取反

    因为黑色对应的值是 0,白色对应的是 1,因此用取反,将存在的眼睛鼻子嘴巴转换为白色,以方便后面使用 find 函数查找,对图片矩阵值取反用函数:

    bw = ~bw;
    

    得到该步代码和结果:

    clear,clc,close all;
    f=imread('eye.jpg');
    g=rgb2gray(f);
    bw=imbinarize(g,0.5);
    bw=~bw;     %对二值图bw取反
    imshow(bw);
    

    在这里插入图片描述

  3. 通过观察和 sum 函数确定眼睛区域

    根据 sum 函数的投影原理,由于单纯的横轴方向不利于确定眼睛的坐标位置,因此可以从纵向考虑,先利用纵轴的上下坐标,将眼睛的部分先切割出来,然后去除左右两边的黑色。所以,首要任务是找到眼睛的上下边界。

    利用 sumplot 查看水平投影的值:

    clear,clc,close all;
    f=imread('eye.jpg');
    g=rgb2gray(f);
    bw=imbinarize(g,0.5);
    bw=~bw;              %对二值图bw取反
    imshow(bw);
    rs=sum((bw'));       %对转置后的图片求sum,以配合plot找出眼睛部分
    plot(rs);            %输出 rs 数组的值的分布
    

    在这里插入图片描述
    从图中可以发现,水平投影中有四部分为有值部分,观察得知,第二部分是眼睛所在位置,眼睛部分也是最多的部分,为了让程序更有健壮性,我们可以选取跨度最多的部分的左右坐标,以确定眼睛的上下边界,这里可以新建一个空数组,然后找到每部分的起始坐标和结束坐标,存入数组,通过将每部分两坐标的差值进行比较,找到跨度最大的部分,选其起始和结束坐标作为眼睛的上下边界。

    新增代码为:

    [h,w]=size(bw);          %利用size函数可以返回图像的高和宽的值,方便下面控制循环结束
    s=[];                    %新建空数组,以存储找到的每部分的边界值
    a=1;b=1;
    while(a<h)               %控制扫描所有的点while(rs(a)==0&&a<h) %找到非0点的开始a=a+1;endb=a;while(rs(b)>0&&b<h)  %找到非0点的结束b=b+1;ends=[s;a b];           %将开始和结束点加入空数组a=b;
    end
    
    [h,w]=size(bw);    % size 函数可以返回图像的高和宽,高的值存入 h 中,宽的值存入 w 中。
    
    s=[s;a b];    % 给数组 s 新加值,新值为 a 和 b ,因为 (a b) 构成了一个元素,因此可以知道 s 是一个有两列值的数组。
    

    运行过之后可以从右侧工作区发现每个变量的值:

    在这里插入图片描述
    双击工作区 s 查看 s 的值:
    在这里插入图片描述
    可以发现 s 中存的就是每部分的开始和结束坐标,最后多出了一项相同的,是循环到终点满足 while 循环的条件导致,可以在 while 循环中添加判断语句以控制不出现该项,因为此处不影响,后面用到再添加该段代码。

  4. 找出差值最大部分的坐标

    利用数组 s 的第二列减去第一列,找到差值最大的行,该行的两个值就是眼睛的上下边界

    新加代码为:

    slength = s(:, 2) - s(:, 1);
    [length, num] = max(slength);
    

    slength = s(:, 2) - s(:, 1); 截取 s 的第二列和第一列并相减,将减后的数组赋给 slength 。前面学过,用 () 可以进行矩阵的切割,利用括号内的参数,可以选择某几行和某几列构成新的矩阵,该句代码用的也是该思想,用括号内的第一个参数 : 选择所有的行,第二个参数单独一个数字选择第 n 列,便返回一个一维数组,两个一维数组相减,就是对应位置的元素值相减,就可以得到每一部分的长度。

    [length, num] = max(slength); 对数组 slength 使用函数 maxlengthslength 中的最大值,num 为最大值对应的位置。

    运行后的值为:
    在这里插入图片描述

  5. 根据坐标切割眼睛

    将眼睛的上下界找到后,用 find函数找出左右边界,切割即得出眼睛位置

    hresult=bw(s(num,1):s(num,2),:);  %从眼睛的上下边界截取二值图部分,得到中间的眼睛部分
    [~,c]=find(hresult);     %从中间的眼睛部分找到眼睛的左右边界, ~代表不要该维度的值
    result1=bw(s(num,1):s(num,2),min(c):max(c));   %对二值图进行切割
    result2=f(s(num,1):s(num,2),min(c):max(c),:);  %对原图进行切割
    figure,imshow(result1),title('切割二值图');
    figure,imshow(result2),title('切割原图');
    

    在这里插入图片描述

    完整代码

    clear,clc,close all;
    f=imread('eye.jpg');
    g=rgb2gray(f);
    bw=imbinarize(g,0.5);
    bw=~bw;
    imshow(bw),title('二值图');
    rs=sum((bw'));
    figure;
    plot(rs);
    [h,w]=size(bw);%利用size函数可以返回图像的高和宽的值,方便下面控制循环结束
    s=[];%新建空数组,以存储找到的每部分的边界值
    a=1;b=1;
    while(a<h)  %控制扫描所有的点while(rs(a)==0&&a<h) %找到非0点的开始a=a+1;endb=a;while(rs(b)>0)  %找到非0点的结束b=b+1;ends=[s;a b];   %将开始和结束点加入空数组a=b;
    end
    slength=s(:,2)-s(:,1);
    [length,num]=max(slength);
    hresult=bw(s(num,1):s(num,2),:);
    [~,c]=find(hresult);
    result1=bw(s(num,1):s(num,2),min(c):max(c));
    result2=f(s(num,1):s(num,2),min(c):max(c),:);
    figure,imshow(result1),title('切割二值图');
    figure,imshow(result2),title('切割原图');
    



3. 切割眼睛简便方法

result = bwareaopen(bw, 500);

去除小对象函数,利用该函数去除所有连通区域中区域大小小于 500 的对象,第二个值的大小可以根据需要设定

clear,clc,close all;
f=imread('eye.jpg');
g=rgb2gray(f);bw=imbinarize(g,0.5);
bw=~bw;
imshow(bw),title('二值图');
result=bwareaopen(bw,500);
figure,imshow(result);

在这里插入图片描述


http://chatgpt.dhexx.cn/article/2ZkktQ7i.shtml

相关文章

理解Kalman滤波的使用

Kalman滤波简介 Kalman滤波是一种线性滤波与预测方法&#xff0c;原文为&#xff1a;A New Approach to Linear Filtering and Prediction Problems。文章推导很复杂&#xff0c;看了一半就看不下去了&#xff0c;既然不能透彻理解其原理&#xff0c;但总可以通过实验来理解其具…

卡尔曼滤波(Kalman Filtering)——(6)MATLAB仿真(保姆级)

MATLAB仿真 一、卡尔曼滤波的实际应用二、流程图三、执行过程四、程序代码五、仿真结果参考文献 一、卡尔曼滤波的实际应用 在这里依旧以前面提到的测量硬币为例进行MATLAB仿真。现有一枚硬币为了这枚硬币的直径&#xff0c;我们进行了多次测量&#xff0c;但是所使用的的尺子存…

Kalman Filter 遇到 Deep Learning : 卡尔曼滤波和深度学习有关的论文

突然心血来潮&#xff0c;想到卡尔曼滤波器是否能和深度学习结合。于是从谷歌学术上搜了一下&#xff0c;发现现在这方面的工作还没有太多结合。Top 期刊 TNNLS 2021 有一篇最新工作。ICLR 2020 出现一篇 Kalman Filter Is All You Need 的文章&#xff0c;但目前从开源的审稿意…

目标跟踪:卡尔曼滤波(Kalman Filter)到底是怎么工作的?

Kalman filter到底是怎么工作的&#xff1f; 本文主要参考的文章&#xff1a;https://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/&#xff0c;图片也基本来自上述博客 其实接触KF已经很久了&#xff0c;听过对应的课程&#xff0c;也对着公式进行过推导&#x…

卡尔曼滤波(kalman)

卡尔曼&#xff08;kalman&#xff09;滤波原理 kalman滤波器可以看做状态变量在由观测生成的线性空间上的射影。 如下状态空间模型描述的动态系统&#xff1a; (1) ​​​​​​​ ​​​​​​​ (2) 式中&#xff0c;k为离散时间&#xff…

卡尔曼滤波(Kalman filter)及预测

参考文章&#xff1a;https://blog.csdn.net/baidu_38172402/article/details/82289998; https://www.jianshu.com/p/2768642e3abf kalman滤波的作用&#xff1a;1.数据 滤波&#xff1b;2.数据预测 3.数据融合。其基本原理&#xff1a;是通过协方差 来进行加权。 1.什么是…

【Kalman】卡尔曼滤波Matlab简单实现

本节卡尔曼滤波Matlab实现是针对线性系统估计的&#xff0c;仅为简单仿真。 1.离散时间线性动态系统的状态方程 线性系统采用状态方程、观测方程及其初始条件来描述。线性离散时间系统的一般状态方程可描述为 其中&#xff0c;X(k) 是 k 时刻目标的状态向量&#xff0c;V(k)…

学习OpenCV——Kalman滤波

背景&#xff1a; 卡尔曼滤波是一种高效率的递归滤波器(自回归滤波器), 它能够从一系列的不完全及包含噪声的测量中&#xff0c;估计动态系统的状态。卡尔曼滤波的一个典型实例是从一组有限的&#xff0c;包含噪声的&#xff0c;对物体位置的观察序列&#xff08;可能有偏差&a…

卡尔曼滤波Kalman Filtering:介绍

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 控制理论(control theory&#xff09;是工程学的分支之一&#xff0c;主要应对工程系统控制的问题。比如控制汽车发动机的功率输出&#xff0c;稳定电动机的转速&#xff0c;控制“反应速率”&#x…

kalman 滤波 演示与opencv代码

在机器视觉中追踪时常会用到预测算法&#xff0c;kalman是你一定知道的。它可以用来预测各种状态&#xff0c;比如说位置&#xff0c;速度等。关于它的理论有很多很好的文献可以参考。opencv给出了kalman filter的一个实现&#xff0c;而且有范例&#xff0c;但估计不少人对它的…

Ensemble Kalman filter集合卡尔曼滤波

在气象预测领域&#xff0c;很多时候&#xff0c;模型具有 O ( 10 e 8 ) O(10e8) O(10e8)以上的量级&#xff0c;如果使用传统的卡尔曼滤波&#xff0c;协方差矩阵的更新将是一个~ 10 e 22 10e22 10e22量级的计算操作&#xff0c;因此传统的卡尔曼滤波并不适用。集合卡尔曼滤波…

Kalman滤波MATLAB实现实例——在温度测量中的应用

参考&#xff1a;《卡尔曼滤波原理及应用MATLAB仿真》 原理介绍 假设我们要研究的对象是一个房间的温度。根据经验判断,这个房间的温度大概在25℃左右,可能受空气流通、阳光等因素影响,房间内温度会小幅度地波动。我们以分钟为单位,定时测量房间温度,这里的1分钟,可以理解为采…

图解卡尔曼滤波(Kalman Filter)

背景 关于滤波 首先援引来自知乎大神的解释。 “一位专业课的教授给我们上课的时候&#xff0c;曾谈到&#xff1a;filtering is weighting&#xff08;滤波即加权&#xff09;。滤波的作用就是给不同的信号分量不同的权重。最简单的loss pass filter&#xff0c; 就是直接把低…

卡尔曼滤波(Kalman Filter)原理理解和测试

Kalman Filter学原理学习 1. Kalman Filter 历史 Kalman滤波器的历史,最早要追溯到17世纪,Roger Cotes开始研究最小均方问题。但由于缺少实际案例的支撑(那个时候哪来那么多雷达啊啥的这些信号啊),Cotes的研究让人看着显得很模糊,因此在估计理论的发展中影响很小。17世纪…

Kaplan-Meier

Kaplan-Meier 算法 Kaplan-Meier&#xff0c;是一种生存分析的常用方法&#xff0c;用于研究某一个因素对于生存时间的影响。在医学广泛使用&#xff0c;比如新药物是否有效的增加癌症病人的存活时间。 计算方法&#xff1a;假设我们已经计算出了时间t1的生存概率是0.95&#…

Kalman滤波器从原理到实现

转载请注明出处&#xff1a;http://xiahouzuoxin.github.io/notes Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than they. Our study of the works of the ancients enables us to give fresh life to their finer…

Kalman Filter 通俗讲解

引言 Kalman Filter&#xff0c;很多人刚听到这个名词时&#xff0c;总是会下意识认为这就是个滤波器。我这里想要重点声明的是&#xff0c;Kalman Filter不是滤波&#xff0c;它是一种信息融合的过程。 那么Kalman Filter到底是什么&#xff1f;它在那些方面有着应用&#xf…

卡尔曼(kalman)详解

Kalmanfliter [TOC](Kalmanfliter) kalman详解贝叶斯准则(Bayes rule)全概率定理贝叶斯卡尔曼matlab仿真 kalman详解 贝叶斯准则(Bayes rule) 全概率定理 两个随机变量 X 和 Y 的联合分布(joint distribution)如下: p (x , y) p (X x , Y y)&#xff08;Xx&#xff0c;Yy同…

kalman简单例子——初始化参数对kalman性能的影响

此篇为第⑤篇,多目标跟踪系列文章: 基础demor入门①②;公式推导③④;深入分析初始化参数的影响⑤; ① Matlab Kalman滤波例子——小球跟踪解析 :matlab官方例子,单目标跟踪。匀速模型和匀加速模型 ②Matlab Kalman Filter based Multiple object Tracking 官方例子 多目…

卡尔曼(kalman)滤波器原理

引言&#xff1a;卡尔曼滤波器适用于线性高斯系统&#xff0c;若为非线性系统&#xff0c;可以使用扩展卡尔曼滤波器。 一、状态估算器 如下图&#xff0c;如果我们需要知道火箭发射时尾部内部的实际温度&#xff0c;这个温度与火箭的燃料输入有关。但是由于里面温度过高&…