视觉图像:matlab纹理分割编程实例
的有关信息介绍如下:绪:
使用纹理滤波器进行分割就是利用图像中不同区域的纹理来对图像的区域进行划分;
纹理是指一个物体上的颜色模式或者指物体表面的光滑程度;
纹理描述图像中的区域特征,试图直观地定量描述诸如光滑、质地等参数;
在遥感、医学图像处理和自动化侦查中,纹理分割图像有着很多的应用;
利用纹理可以用来检测图像的边界,从而对图像进行分割;
主要讲述一个基于纹理分割方法确定纹理区域的示例;
工具:matlab
目的:使用纹理滤波器在图像中分割出2种类别;
使用纹理滤波器分割图像的基本步骤如下:
①读取图像;
②创建纹理图像;
③显示图像不同部分的纹理;
④使用合适的滤波器进行分割。
读取图像:
%Step 1: Read Image
I1 = imread('bag.png');
I = rgb2gray(I1);
figure
imshow(I);
创建纹理图像
使用纹理函数entropyfilt()创建纹理图像,返回与输入图像大小相同,每个像素值是输入图像相应像素值邻域的熵值;
使用比例函数rescale()变成double图像;
%Step 2: Create Texture Image
E = entropyfilt(I);%
Eim = rescale(E);%
figure
imshow(Eim);
为底层纹理创建二值掩膜图像
①分割后的图像目标区域显示为白色;
②与原图像相比,图像顶部的纹理被过度分割,而底部纹理则以一个整体被分割出来;
③使用bwareaopen函数提取图像的底部纹理;
④分割图像的边界并不光滑,并且含有很多孔洞,使用imclose函数对图像执行形态学关操作;使用imfill函数对图像中的孔洞进行填充;
%Step 3: Create Rough Mask for the Bottom Texture
BW1 = imbinarize(Eim,0.8);%阈值分割
figure
imshow(BW1);
imwrite(BW1,'thresholdimg1.png');
BWao = bwareaopen(BW1,2000);%开运算,连通域
imshow(BWao)
nhood = true(11);
closeBWao = imclose(BWao,nhood);%闭合孔洞
imshow(closeBWao)
roughMask = imfill(closeBWao,'holes');%孔洞填充
imshow(roughMask)
使用掩膜图像分割出上层图像
%Step 4: Use Rough Mask to Segment the Top Texture
I2 = I;
I2(roughMask) = 0;%掩膜操作
imshow(I2);
imwrite(I2,'segmentimg1.png');
E2 = entropyfilt(I2);%重计算纹理图像
E2im = rescale(E2);
imshow(E2im)
BW2 = imbinarize(E2im);%自适应阈值分割
imshow(BW2);
mask2 = bwareaopen(BW2,1000);
imshow(mask2);
提取底层、上层图像和绘制边界:
%Step 5: Display Segmentation Results
texture1 = I;
texture1(~mask2) = 0;%上层图像
imshow(texture1)
texture2 = I;
texture2(mask2) = 0;%底层图像
figure
imshow(texture2)
imwrite(texture2,'bottomimg.png');
boundary = bwperim(mask2);
segmentResults = I;
segmentResults(boundary) = 255;%绘制边界
imshow(segmentResults)
除了使用entropyfilt函数,还可以使用标准差stdfilt()和rangefilt()来达到类似的分离效果;
% Step 6:Using Other Texture Filters in Segmentation
S = stdfilt(I,nhood);
imshow(rescale(S));
imwrite(rescale(S),'stdfiltimg.png');
R = rangefilt(I,ones(5));
imshow(R);
imwrite(R,'rangefiltimg.png');
【注】:matlab rescale()函数:
function y = rescale(x,a,b)
% rescale - rescale data in [a,b]
% y = rescale(x,a,b);
% Copyright (c) 2004 Gabriel Peyr?
if nargin<2
a = 0;
end
if nargin<3
b = 1;
end
m = min(x(:));
M = max(x(:));
y = (b-a) * (x-m)/(M-m) + a;