使用纹理过滤器进行纹理分割
这个例子展示了如何根据纹理识别和分割区域。
读取图像
读取并显示袋上纹理图案的灰度图像。
I = imread(“bag.png”);imshow (I)标题(原始图像的)
创建纹理图像
使用entropyfilt
创建一个纹理图像。这个函数entropyfilt
返回一个数组,其中每个输出像素包含输入图像中对应像素周围9 × 9邻域的熵值我
.熵是随机性的一种统计度量。
你也可以使用stdfilt
而且rangefilt
以达到相似的分割结果。为了与局部熵的纹理图像进行比较,创建纹理图像年代
而且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)标题(“区域打开纹理图像”)
使用imclose
使边缘光滑,并关闭物体上的任何开放的孔BWao
.指定与所使用的相同的9 × 9邻域entropyfilt
.
Nhood = ones(9);closeBWao = imclose(BWao,nhood);imshow (closeBWao)标题(“封闭纹理图像”)
使用imfill
填补物体上的洞closeBWao
.底部纹理的蒙版并不完美,因为蒙版没有延伸到图像的底部。但是,你可以使用蒙版来分割纹理。
mask = imfill(closeBWao,“黑洞”);imshow(面具);标题(“底部纹理蒙版”)
使用蒙版分割纹理
将纹理分离成两个不同的图像。
textureTop = I;textureTop(mask) = 0;textureBottom = I;textureBottom(~mask) = 0;蒙太奇({textureTop textureBottom},“大小”(1 - 2),“写成BackgroundColor”,' w ',“BorderSize”, 20)标题(分割顶部纹理(左)和分割底部纹理(右))
显示分割结果
创建一个标签矩阵,其中掩码所在的标签为1假
以及掩码所在的标签2真正的
.在原始图像上叠加标签矩阵。
L =掩码+1;L) imshow (labeloverlay(我)标题(“标记分割区域”)
用青色勾勒两个纹理之间的边界。
Boundary = bwperim(mask);imshow (labeloverlay(边界,我“Colormap”,[0 1 1]))“纹理边界”)
另请参阅
entropyfilt
|bwareaopen
|imclose
|imbinarize
|imfill
|bwperim
|rangefilt