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