一、定义

二值图即黑白图,图中只有黑白色之分。图像的二维矩阵只由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图像。

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: