【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”

article/2025/8/27 19:35:48

【MATLAB Image Processing Toolbox 入门教程七】

  • 1 imbinarize函数
    • 1.1 imbinarize函数使用语法及说明
    • 1.2 imbinarize函数参数说明
    • 1.3 imbinarize函数使用示例
      • 1.3.1 使用全局阈值和局部自适应阈值对图像二值化
      • 1.3.2 检测前景比背景暗的图像
  • 2 graythresh函数
  • 3 otsuthresh函数
  • 4 adaptthresh函数


在上一节【MATLAB Image Processing Toolbox 入门教程六】“导入、导出和转换”之“图像类型转换Ⅰ——在不同图像类型之间转换”中我们讲解了MATLAB常用的图像类型转换函数的含义和用法。在本节中,我们针对二值图像的转换进行详细讲解。


1 imbinarize函数

在【MATLAB Image Processing Toolbox 入门教程二】快速入门之“亮度校正”和“目标识别”中我们已经简单使用过imbinarize函数,它的作用是使用阈值化方法将灰度图像或者灰度三维体二值化,注意,只能是灰度图像,如果要将其他类型图像转为二值图像,则需要先将其转化为灰度图。接下来我们对其进行详细介绍。

1.1 imbinarize函数使用语法及说明

  1. BW=imbinarize(I):使用Otsu方法,将I中所有高于全局阈值的像素值替换为1,其余替换为0。imbinarize 使用包含 256 位的图像直方图来计算 Otsu 阈值。
  2. BW=imbinarize(I,method):使用 method 指定的阈值化方法(‘global’ 或 ‘adaptive’)从图像 I 创建二值图像。
  3. BW=imbinarize(I,T):使用阈值 T 从图像 I 创建二值图像。T 可以是指定为亮度值标量的全局图像阈值,也可以是指定为亮度值矩阵的局部自适应阈值。
  4. BW=imbinarize(I,‘adaptive’,Name,Value):使用Name-Value来控制自适应阈值的几个因素,在下面的参数说明中会详细讲解。

1.2 imbinarize函数参数说明

输出参数BW就是一个二值图像,是一个与输入的I大小相同的逻辑数组或逻辑矩阵。下面对输入参数进行讲解。

  1. I:输入的二维灰度图像或三维灰度图像体。注意!!!若直接对RGB图像使用imbinarize函数,则imbinarize函数会将其看做三维体灰度图像,不会单独对每个通道二值化,所以若要将RGB图像二值化,首先使用rgb2gray函数将其转化为灰度图像。
  2. method:二值化所用到的方法,指定为:
    ①‘global’:用 Otsu 方法计算全局图像阈值。计算全局阈值的函数是graythresh和otsuthresh,此函数会在第二节和第三节分别详细讲解。
    ②‘adaptive’:使用每个像素周围的局部一阶图像统计量来计算局部自适应图像阈值。与此相关的函数是adaptthresh,此函数会在第四节详细讲解。
  3. T:阈值,指定为由范围 [0, 1] 内的值组成的数值标量或数值数组。如果T是数值标量,则imbinarize函数将其看做全局阈值,若T是数值数组,则imbinarize函数将其看做自适应局部阈值。
  4. Name-Value
    ①’Sensitivity’:自适应阈值的敏感度因子。默认为0.5,可以指定为[0 1]内的数。敏感度越高,越多的像素会被阈值化为前景,说白了,就是越多的像素被替换为1.
    ②’ForegroundPolarity’:此参数确定哪些像素被视为前景像素。有两个值:‘bright’(default)和’dark’。'bright’代表前景比背景亮,'dark’代表前景比背景暗。在【MATLAB Image Processing Toolbox 入门教程一】快速入门之“图像导入导出”与“检测图像中的圆”中查找圆的函数imfindcircles,我们就探究过bright和dark的区别,这里再说明一下:如果我们需要强调的对象是比背景亮的,那此参数就指定为bright,反之,就指定为dark。

1.3 imbinarize函数使用示例

1.3.1 使用全局阈值和局部自适应阈值对图像二值化

此示例中,我们分别使用全局阈值法和局部自适应阈值法对同一图像进行二值化,查看其中的区别。

src1=imread('coins.png');
src2=imread('rice.png');src1_bw1=imbinarize(src1); %使用全局阈值对图像1进行处理
src1_bw2=imbinarize(src1,'adaptive'); %使用局部自适应阈值对图像1进行处理src2_bw1=imbinarize(src2); %使用全局阈值对图像2进行处理
src2_bw2=imbinarize(src2,'adaptive'); %使用局部自适应阈值对图像2进行处理figure;
subplot(1,3,1);imshow(src1);title('原图1');
subplot(1,3,2);imshow(src1_bw1);title('全局阈值法');
subplot(1,3,3);imshow(src1_bw2);title('局部自适应阈值法');figure;
subplot(1,3,1);imshow(src2);title('原图2');
subplot(1,3,2);imshow(src2_bw1);title('全局阈值法');
subplot(1,3,3);imshow(src2_bw2);title('局部自适应阈值法');

在这里插入图片描述
在这里插入图片描述
可以看出,局部自适应阈值法更为敏感,检测目标更为准确,但同时,背景中一些噪声点也容易被检测出来。

1.3.2 检测前景比背景暗的图像

在1.3.1节中,处理的两张图像rice.png和coins.png都是前景比背景亮的图像。在此示例中,我们将使用imbinarize函数对前景比背景暗的图像进行二值化。

I=imread('printedtext.png');
J=imbinarize(I,'adaptive','ForegroundPolarity','dark','Sensitivity',0.4);
subplot(1,2,1);imshow(I);title('Source Image');
subplot(1,2,2);imshow(J);title('Binary Image');

在这里插入图片描述
可以看出,图像中被背景暗的字全部被提取出来。

2 graythresh函数

此函数的作用是使用Otsu方法计算图像的全局阈值。具体的使用方法为:

  1. T=graythresh(I):使用Otsu的方法根据灰度图像I计算全局阈值T。T是[0 1]内的数值标量。
  2. [T,EM]=graythresh(I):除了返回全局阈值外,还会返回阈值的有效性度量,它也是[0 1]内的正标量。

接下来,我们结合imbinarize函数,计算一个灰度图像的全局阈值,并将其转为二值图像。

I=imread('coins.png');
T=graythresh(I);
BW=imbinarize(I,T);
imshowpair(I,BW,'montage');

在这里插入图片描述
在这里插入图片描述
可以看出,图像的全局阈值为0.4941。

3 otsuthresh函数

otsuthresh函数和graythresh函数一样,也是计算全局阈值,但所不同的是,otsuthresh函数是利用直方图来计算全局阈值。此函数的使用方法为:

  1. T=otsuthresh(counts)
  2. [T,EM]=otsuthresh(counts)
    参数T和EM的含义与graythresh函数一样,对于参数counts,它是图像的直方图个数,是一个非负数向量。

下面,我们就使用otsuthresh函数计算图像的全局阈值,并将图像转换为二值图像。

I=imread('coins.png');
[counts,x]=imhist(I,16); %计算图像I的16位直方图
stem(x,counts); %将直方图用离散的点绘制出来

在这里插入图片描述
接下来,我们使用直方图计算全局阈值:

T=otsuthresh(counts);
BW = imbinarize(I,T);
imshow(BW);

在这里插入图片描述
此时的全局阈值T为:
在这里插入图片描述

4 adaptthresh函数

此函数的功能是计算灰度图像或灰度三维体的局部自适应阈值。函数使用方法为:

  1. T=adaptthresh(I):计算二维灰度图像或三维灰度体 I 的局部自适应阈值。adaptthresh 函数基于每个像素邻域的局部均值强度(一阶统计量)选择阈值。注意,此函数返回的T不是一个数值标量,而是和输入图像I大小相同的数值矩阵和数值数组。
  2. T=adaptthresh(I,sensitivity):指定敏感因子计算局部自适应阈值。sensitivity是[0 1]内的标量,默认是0.5。
  3. T=adaptthresh(___,Name,Value):使用Name-Value来控制自适应阈值的各个因素。Name-Value参数有:
    ①’NeighborhoodSize’:用于计算每个像素周围局部统计量的领域大小。指定为正奇整数或由正奇整数组成的二元素向量。
    ②’ForegroundPolarity’:此参数确定哪些像素被视为前景像素。有两个值:‘bright’(default)和’dark’。'bright’代表前景比背景亮,‘dark’代表前景比背景暗。
    ③’Statistic’:此参数用于计算每个像素的局部阈值统计量。指定为:‘mean’(default)(邻域局部均值强度)、‘median’(邻域局部中值)、‘gaussian’(邻域高斯加权均值)。

接下来,我们对adaptthresh函数的使用举例讲解。

一、计算暗背景图像的阈值并进行二值化
在此示例中,我们修改不同的sensitivity值,来观察adaptthresh的效果。

I=imread('rice.png');
%计算局部自适应阈值
T1=adaptthresh(I); %使用默认的0.5
T2=adaptthresh(I,0.3);
T3=adaptthresh(I,0.7);
%利用局部自适应阈值将图像二值化
BW1=imbinarize(I,T1);
BW2=imbinarize(I,T2);
BW3=imbinarize(I,T3);subplot(2,2,1);imshow(I);title('原图');
subplot(2,2,2);imshow(BW1);title('灵敏度0.5');
subplot(2,2,3);imshow(BW2);title('灵敏度0.3');
subplot(2,2,4);imshow(BW3);title('灵敏度0.7');

在这里插入图片描述
可以看出,灵敏度过高,很多背景中的点会被检测出来,灵敏度过低,有些目标对象没有被检测。

二、计算亮背景图像的阈值并进行二值化
既然是亮背景,那也就说明检测对象比背景暗,所以’ForegroundPolarity’参数需要指定为’dark’。

I=imread('printedtext.png');
T=adaptthresh(I,0.4,'ForegroundPolarity','dark');
BW=imbinarize(I,T);
subplot(1,3,1);imshow(I);title('原图');
subplot(1,3,2);imshow(T);title('背景');
subplot(1,3,3);imshow(BW);title('二值化');

在这里插入图片描述

至此,阈值法转换二值图像就讲解完毕,我们下节见:)


http://chatgpt.dhexx.cn/article/1VTpXp3p.shtml

相关文章

matlab graythresh3,Matlab—影像分析进阶

在这篇文章里面我们要做的事情全部都围绕两个问题,一个图像当中有多少个 xxx,他们的大小是多少,举个例子 上图是一个米的影像,这张图片里有很多的米,现在我们的问题是,这里面有多少米,他们的大小是多少? graythresh() & im2bw() 要回答上述两个问题,首先要做的是对…

matlab graythresh()函数使用的注意点

用matlab进行图像处理时,经常会遇到设置一个阈值将灰度图处理为二值图的情况。 一般都会这样子 Iimread(1.jpg); levelgraythresh(I); BWim2bw(I,level); 这里就有一个小坑了 比如1.jpg这个读入的图片,每一个像素位置的灰度都是整型。但是你强行转成了…

2.23学习心得 Matlab graythresh函数 形态学开闭操作,腐蚀膨胀的作用

关于graythresh 函数 函数功能:使用 最大类间方差法找到图片的一个合适的阈值(threshold)。在使用 im2bw函数将灰度图像转换为二值图像时,需要设定一个阈值,这个函数可以帮助我们获得一个合适的阈值。利用这个阈值通常…

graythresh

使用Otsu方法计算全局图像阈值 语法: T graythresh(I) [T,EM] graythresh(I)说明: T graythresh(I) 使用 Otsu 方法 , 根据灰度图像 I 计算全局阈值 T。Otsu 方法选择一个阈值,使阈值化的 黑白像素的类内方差最小化。全局阈值…

软件测试题目

单项选择题:共20小题,每小题1 分,满分20分;请将答案填入题后括号中。 1. 在软件生命周期的哪一个阶段,软件缺陷修复费用最低 ( A ) (A&#xff…

软件测试题1

单选题 1、系统测试使用(C)技术, 主要测试被测应用的高级互操作性需求, 而无需考虑被测试应用的内部结构。 A、 单元测试 B、 集成测试 C、 黑盒测试 D、白盒测试 2、单元测试主要的测试技术不包括(B ) A、白…

软件测试题

以题会题 一、单选题 1、对软件进行测试的根本目的是什么?( C ) A、提高软件的质量 B、确保程序符合用户的需求 C、找出程序中的缺陷 D、确保程序没有缺陷 2、在软件生命周期哪个阶段,软件缺陷修复费用最低?&#xf…

软件测试期末考试题

一、单项选择题(每小题2分,共21530分) 1、软件测试的目的( C) A.避免软件开发中出现的错误 B.发现软件开发中出现的错误 C.尽可能早地发现并排除软件中潜藏的错误,提高软…

100道软件测试练习题,看看你能有多少分

软件测试与质量保证-软件测试部分练习题 1单选(2分) 软件测试用例主要由输入数据和_________两部分组成。 A.预期输出结果2.00/2.00 B.测试计划 C.以往测试记录分析 D.测试规则 2单选(2分) 与设计测试用例无关的文档是_________。 A.项目开发计划2.00/2.00 B.源程序 …

杨辉三角python小代码

刚刚上机课,老师居然让我们打印杨辉三角?? 结果 def yangHuiSanJiao(n):#打印第一行和第二行print("1".center(50))next_line [1,1]second_line .join([str(i) for i in next_line])print(second_line.center(50))for i in rang…

【5分钟力扣】118.杨辉三角 python

文章目录 一、题目二、解题思路三、三种解题示例 一、题目 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。 在杨辉三角中,每个数是它左上方和右上方的数的和。 示例: 输入: 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1] ]二、解题思…

蓝桥杯-杨辉三角形-python

题目 可以结合目录来理解文章~ 原始方法 这个方法可以拿到40分。N数值比较大的时候,运行时间会超过限制。 思路 逐行生成杨辉三角,找到了需要的N以后就停止循环,并输出对应的位置。 变量解释 用于计算N的位置的公式如下: po…

第十二届蓝桥杯 杨辉三角形 Python题解 满分

原地址https://artrajz.cn/index.php/archives/32/ 前言 其实道题在寒假的时候就做了,现在有机会发出来了。(〃‘▽’〃) 题目 思路 参考了大佬斜行查找的思路,为了便于观察和叙述,我把杨辉三角形如图排一下 1 1 1 1 2 1 1 3 3 …

python杨辉三角居中_利用python打印杨辉三角

用python打印杨辉三角 介绍 杨辉三角,是初高中时候的一个数列,其核心思想就是说生成一个数列,该数列中的每一个元素,都是之前一个数列中,同样位置的元素和前一个元素的和。 正好在python中,也就是生成一…

杨辉三角形(Python)

杨辉三角形的规则就是每行的第一个数字和最后一个数字为1之外,其余每个数字等于上一行对应两个数字的和。 1、使用二维数组实现 def triangle(row):result []for i in range(row):if i 0: # 第一行result.append([1])elif i 1: # 第二行result.append([1,1])e…

杨辉三角Python解法

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 例: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 解析: 大于等于2行以后&#x…

pythonfor杨辉三角,python实现杨辉三角 python实现杨辉三角的几种方法代码实例

想了解python实现杨辉三角的几种方法代码实例的相关内容吗,看,月亮在跳舞在本文为您仔细讲解python实现杨辉三角的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python实现杨辉三角,python杨辉三角实现方法&am…

【完美解析】蓝桥杯 省赛 杨辉三角形 python组 找规律+二分查找+组合数

题目 看到最后如果还不懂你来打我~ 分析 我们看到杨辉三角形很容易想到一个数的值等于它肩膀两个数的和。为此,可以不断通过前一行的数求出后一行的数,重复上面操作,直到找到目标为止。但是看了用例规模后发现其涉及到十的九次方&#xff0…

【基础】杨辉三角python题解

题目 1231: 杨辉三角 时间限制: 1Sec 内存限制: 128MB 提交: 2261 解决: 750 题目描述 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 输入 输入数据包含多个…

杨辉三角形 python

class CircleQueue(object):def __init__(self,max50):# 队列最大容量self.max max# 存储队列元素的数组self.data [None for i in range(self.max)]# 队首指针self.front 0# 队尾指针self.rear 0def empty(self)::Desc判队空:return:如果队为空,返回True如果队…