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

【MATLAB Image Processing Toolbox 入门教程七】


在上一节【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('局部自适应阈值法');

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
可以看出,局部自适应阈值法更为敏感,检测目标更为准确,但同时,背景中一些噪声点也容易被检测出来。

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');

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
可以看出,图像中被背景暗的字全部被提取出来。

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');

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
可以看出,图像的全局阈值为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); %将直方图用离散的点绘制出来

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
接下来,我们使用直方图计算全局阈值:

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

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

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');

【MATLAB Image Processing Toolbox 入门教程七】“导入、导出和转换”之“图像类型转换Ⅱ——使用阈值法转换为二值图像”
可以看出,灵敏度过高,很多背景中的点会被检测出来,灵敏度过低,有些目标对象没有被检测。

二、计算亮背景图像的阈值并进行二值化
既然是亮背景,那也就说明检测对象比背景暗,所以’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('二值化');

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

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

上一篇:读取图片文件、处理和保存


下一篇:matlab实现平滑滤波