17.6 使用纹理滤波器分割图像(1)
使用纹理滤波器分割图像的基本步骤如下:
读取图像;
创建纹理图像;
显示图像不同部分的纹理;
使用合适的滤波器进行分割。
下面通过一个例子来看一下如何使用纹理滤波器对图像进行分割。
例17-7 利用纹理滤波器进行图像分割。
使用纹理滤波器进行分割就是利用图像中不同区域的纹理来对图像的区域进行划分。纹理是指一个物体上的颜色模式或者指物体表面的光滑程度。纹理描述图像中的区域特征,试图直观地定量描述诸如光滑、质地等参数。在遥感、医学图像处理和自动化侦查中,纹理分割图像有着很多的应用。利用纹理可以用来检测图像的边界,从而对图像进行分割。
【本例要点】在本例中首先求取图像不同部分的纹理,然后使用entropyfilt、stdfilt、rangefilt三个不同的滤波函数对图像进行滤波。
本例的基本步骤如下:
读取图像。
代码如下:
I = imread('bag.png');%读取图像
figure; imshow(I);%显示原图像
在这个程序中,首先读取一幅图像bag,这个图像的顶部和底部的纹理有明显的差异,如图17-29所示。
创建纹理图像。
代码如下:
E = entropyfilt(I);%创建纹理图像
Eim = mat2gray(E);%转化为灰度图像
figure; subplot(121)
imshow(Eim);%显示灰度图像
BW1 = im2bw(Eim, .8);%转化为二值图像
subplot(122); imshow(BW1);%显示二值图像
使用函数entropyfilt创建一幅纹理图像,这个函数返回的图像与输入图像大小相同,每个像素值是输入图像相应像素值邻域的熵值。
使用函数mat2gray将矩阵转化为灰度图像,如图17-30左边图像所示。使用纹理边界处的值0.8作为阈值将灰度图像转化为二值图像,如图17-30右边图像所示。
图17-29 原图像
图17-30 纹理图像的灰度图像显示和二值图像显示
分别显示图像的底部纹理和顶部纹理。
代码如下:
BWao = bwareaopen(BW1,2000);%提取底部纹理
figure; subplot(121)
imshow(BWao);%显示底部纹理图像
nhood = true(9);
closeBWao = imclose(BWao,nhood);%形态学关操作
subplot(122); imshow(closeBWao)%显示边缘光滑后的图像
roughMask = imfill(closeBWao,'holes');%填充操作
figure; subplot(121)
imshow(roughMask);%显示填充后的图像
I2 = I;
I2(roughMask) = 0;%底部设置为黑色
subplot(122); imshow(I2);%突出显示图像的顶部