主要内容

纹理分割使用纹理过滤器

这个例子展示了如何根据纹理来识别和分割区域。

读取图像

读取并显示袋子上纹理图案的灰度图像。

I = imread()“bag.png”);imshow (I)标题(原始图像的

图包含一个轴对象。标题为Original Image的axes对象包含一个Image类型的对象。

创建纹理图像

使用entropyfilt创建纹理图像。这个函数entropyfilt返回一个数组,其中每个输出像素包含输入图像中相应像素周围9 × 9邻域的熵值。熵是随机性的统计度量。

你也可以用stdfiltrangefilt以达到相似的分割结果。为了与局部熵的纹理图像进行比较,创建纹理图像年代R分别显示本地标准偏差和本地范围。

E = entropyfilt(I);S = stdfilt(I,ones(9));R = rangefilt(I,ones(9));

使用重新调节重新缩放纹理图像E年代使得数据类型的图像的像素值在[0,1]范围内

Eim = rescale(E);Sim = rescale(S);

在蒙太奇中显示三个纹理图像。

蒙太奇({Eim, Sim, R},“大小”3 [1],“写成BackgroundColor”' w '“BorderSize”, 20)标题(纹理图像显示局部熵,局部标准差和局部范围

图包含一个轴对象。标题为纹理图像显示局部熵、局部标准差和局部范围的轴对象包含一个图像类型的对象。

为底部纹理创建蒙版

本例继续处理熵纹理图像Eim。您可以使用其他形态学函数对其他两种类型的纹理图像重复类似的过程,以获得类似的分割结果。

对重新缩放后的图像设置阈值Eim分割纹理。选择0.8的阈值是因为它大致是沿着纹理之间的边界像素的强度值。

BW1 = imbinalize (Eim,0.8);imshow (BW1)标题(“阈值纹理图像”

图包含一个轴对象。标题为阈值纹理图像的轴对象包含一个图像类型的对象。

二值图像中的分割对象BW1是白色的。如果你比较一下BW1,你会注意到顶部纹理被过度分割(多个白色物体),而底部纹理几乎是完整分割的。移除顶部纹理中的物体,使用bwareaopen

BWao = bwareaopen(BW1,2000);imshow (BWao)标题(“区域打开的纹理图像”

图包含一个轴对象。标题为Area-Opened Texture Image的坐标轴对象包含一个Image类型的对象。

使用imclose平滑边缘并关闭物体中的任何开孔BWao。指定与使用的相同的9 × 9邻居entropyfilt

Nhood = ones(9);closeBWao = imclose(BWao,nhood);imshow (closeBWao)标题(“封闭纹理图像”

图包含一个轴对象。标题为Closed Texture Image的坐标轴对象包含一个Image类型的对象。

使用imfill把物体上的洞填满closeBWao。底部纹理的蒙版不完美,因为蒙版没有延伸到图像的底部。然而,你可以使用蒙版来分割纹理。

mask = imfill(close);“黑洞”);imshow(面具);标题(“底部纹理蒙版”

图包含一个轴对象。标题为Bottom Texture Mask的坐标轴对象包含一个图像类型的对象。

使用蒙版分割纹理

将纹理分离成两个不同的图像。

textureTop = I;textureTop(mask) = 0;textureBottom = I;textureBottom(~mask) = 0;蒙太奇({textureTop textureBottom},“大小”(1 - 2),“写成BackgroundColor”' w '“BorderSize”, 20)标题(“分割的顶部纹理(左)和分割的底部纹理(右)”

图包含一个轴对象。标题为分段顶部纹理(左)和分段底部纹理(右)的轴对象包含一个图像类型的对象。

显示分割结果

创建一个标签矩阵,其中掩码的标签为1面具所在的标签是2真正的。在原始图像上叠加标签矩阵。

L = mask+1;L) imshow (labeloverlay(我)标题(“标记分割区域”

图包含一个轴对象。标题为Labeled Segmentation Regions的坐标轴对象包含一个图像类型的对象。

用青色勾勒出两个纹理之间的边界。

边界= bwperim(mask);imshow (labeloverlay(边界,我“Colormap”,[0 1 1])) title(“纹理之间的边界”

图包含一个轴对象。标题为Boundary Between Textures的坐标轴对象包含一个图像类型的对象。

另请参阅

||||||