一、定义

二值图即黑白图,图中只有黑白色之分。图像的二维矩阵只由0和1构成,0表黑色,1表白色。

二值化利于图像进一步处理,且数据量减小,易于凸显出目标轮廓。

具体定义可以参考如下链接:

http://zhidao.baidu.com/question/89536354.html

二、原理

首先对有256个亮度等级的灰度图像进行阈值选取(设定一个阈值),当灰度图某个像素数值大于此阈值时,将此像素变成白色,小于此阈值则变成黑色。

三、代码实现

可以由RGBD  D,都要首先进行灰度图的转化(灰度图转化见主页)。

3.1 im2bw函数

OTSU:最大类间方差法,或大津法。按图像灰度特性,将图像分成背景和目标两部分。首先使用 graythresh 函数确定一个阈值,当然也可以自己确定一个阈值,再用 im2bw 函数转换为二值图。

I = imread('keyan.jfif');   %读取到一张图片   
subplot(221)
imshow(I) % 显示原图
title('原图');

Ih = rgb2gray(I); % RGB图像转化成灰度图像
subplot(222)
imshow(Ih) % 显示灰度图
title('灰度图');

thresh1 = graythresh(I); % 针对原图自动确定二值化阈值,阈值越大图像越黑,越小越白
I21 = im2bw(I,thresh1); % 对图像直接进行二值化
% I21 = im2bw(I,value); % 自己设定阈值,value=[0,1]中间的任何数值
subplot(223)
imshow(I21)  % 显示二值化之后的图片
title('RGB图像转化为二值化图像')

thresh2 = graythresh(Ih); % 针对灰度图自动确定二值化阈值
I22 = im2bw(Ih,thresh2);
% I22 = im2bw(Ih,value); % 自己设定阈值,value=[0,1]中间的任何数值
subplot(224)
imshow(I22);
title('灰度图像转化为二值化图像')

自动确定阈值的前提时,结果为:

可见在自动确定阈值的情况下,RGB图像直接转化为二值图 和 先转化为灰度图再转化为二值图的情况,得到的二值化结果会有区别。

观察是因为针对RGB图和针对灰度图自动确定的阈值不一样:

>> thresh1
thresh1 =
    0.5529
>> thresh2
thresh2 =
    0.6235

而如果自己指定一样的阈值,则二值化结果完全一致。

3.2 histeq函数

此函数需要工具箱 Image Processing Toolbox.

I = imread('keyan.jfif');   %读取到一张图片   
subplot(221)
imshow(I) % 显示原图
title('原图');

Ih = rgb2gray(I); % RGB图像转化成灰度图像
subplot(222)
imshow(Ih) % 显示灰度图
title('灰度图');

I21 = histeq(I,2);
subplot(223)
imshow(I21)

I22 = histeq(Ih,2); % 将图像灰度级数改为2,即二值图
subplot(224)
imshow(I22) % 显示二值图

结果:

此法即量化图像(见MATLAB图像处理(一))。
注:图三是尝试直接对RGB图像使用 histeq 函数,没报错,但结果没有参考价值。事实上,histeq 函数的作用对象一般为灰度图像,matlab里帮助文档解释中指出 I 一般指灰度图像,如下:

>> help histeq
 histeq - 使用直方图均衡增强对比度
    此 MATLAB 函数 变换灰度图像 I,以使输出灰度图像 J 的直方图具有 64 个 bin 且大致平
    坦。

    J = histeq(I)
    J = histeq(I,n)
    J = histeq(I,hgram)

    newmap = histeq(X,map)
    newmap = histeq(X,map,hgram)

    [___,T] = histeq(___)

    输入参数
        I - 灰度图像
            数值数组
        hgram - 目标直方图
            数值向量
        n - 离散灰度级的数量
            64 (默认值) | 正整数
        X - 索引图像
            数值数组
        map - 颜色图
            c×3 数值矩阵

    输出参数
        J - 变换后的灰度图像
            数值数组
        T - 灰度变换
            数值向量
        newmap - 变换后的颜色图
            n×3 数值矩阵

3.3 imbinarize函数

新版本的MATLAB中不建议使用 im2bw 函数,而是改用 imbinarize 函数。

I = imread('keyan.jfif');   %读取原图

Ih = rgb2gray(I); % RGB图像转化成灰度图像
subplot(121)
imshow(Ih) % 显示灰度图
title('灰度图');

I2 = imbinarize(Ih);
subplot(122)
imshow(I2) % 显示二值图
title('二值图');

二值化结果如下:

注:此函数只能用于灰度图,不能作用于个RGB图像。

Logo

长江两岸老火锅,共聚山城开发者!We Want You!

更多推荐