纹理分割使用纹理过滤器
这个例子展示了如何识别和部分地区根据自己的口感。
读取图像
读取和显示一个灰度图像纹理模式的袋子。
我= imread (“bag.png”);imshow (I)标题(原始图像的)
创建纹理图像
使用entropyfilt
创建一个纹理图像。这个函数entropyfilt
返回一个数组,其中每个输出像素包含9-by-9社区的熵值在相应的输入图像的像素我
。熵是一个随机性的统计测量。
您还可以使用stdfilt
和rangefilt
实现类似的分割结果。对纹理图像的局部熵相比,创建纹理图像年代
和R
分别显示当地的标准差和当地的范围。
E = entropyfilt(我);S = stdfilt(我的(9));R = rangefilt(我的(9));
使用重新调节
重新调节纹理图像E
和年代
所以像素值在[0,1]范围如预期的图像数据类型双
。
Eim =重新调节(E);Sim =重新调节(年代);
显示三个纹理图片蒙太奇。
蒙太奇({Eim, Sim, R},“大小”3 [1],“写成BackgroundColor”,' w ',“BorderSize”,20)标题(的纹理图像,图像显示了局部熵,当地的标准偏差,和地方范围的)
为底部纹理创建面具
这个例子继续纹理图像的信息熵的处理Eim
。您可以重复类似的过程对于其他两种类型的纹理图像与其他形态函数来实现类似的分割结果。
阈值的新形象Eim
段纹理。选择阈值为0.8,因为它是大致沿着边界像素的强度值之间的纹理。
0.8 BW1 = imbinarize (Eim);imshow (BW1)标题(阈值纹理图像的)
在二进制图像的分割对象BW1
是白色的。如果你比较BW1
来我
,你注意到顶部纹理是过度分割(多个白色对象)和底部纹理分割几乎全部。在顶部纹理通过删除对象bwareaopen
。
BWao = bwareaopen (BW1, 2000);imshow (BWao)标题(“Area-Opened纹理图像”)
使用imclose
平滑的边缘,并关闭任何打开的洞的对象BWao
。指定使用的同一9-by-9社区entropyfilt
。
nhood = 1 (9);closeBWao = imclose (BWao nhood);imshow (closeBWao)标题(封闭的纹理图像的)
使用imfill
对象来填补漏洞closeBWao
。底部的面具质地并不完美,因为面具不扩展到图像的底部。不过,您可以使用掩码段纹理。
掩码= imfill (closeBWao,“黑洞”);imshow(面具);标题(“底部纹理的面具”)
使用掩码段纹理
纹理分割为两个不同的图像。
textureTop =我;textureTop(面具)= 0;textureBottom =我;textureBottom面具(~)= 0;蒙太奇({textureTop textureBottom},“大小”(1 - 2),“写成BackgroundColor”,' w ',“BorderSize”,20)标题(“分段上纹理(左)和分段下纹理(右))
显示分割结果
创建一个标签的矩阵标签1面具在哪里假
和标签2面具在哪里真正的
。覆盖标签在原始图像矩阵。
L =面具+ 1;L) imshow (labeloverlay(我)标题(“标签分割区域”)
两者之间的边界轮廓纹理在青色。
边界= bwperim(面具);imshow (labeloverlay(边界,我“Colormap”[0,1]))标题(“纹理之间的界限”)
另请参阅
entropyfilt
|bwareaopen
|imclose
|imbinarize
|imfill
|bwperim
|rangefilt