这个例子展示了如何根据纹理识别和分割区域。
阅读并显示袋子上的纹理图案的灰度图像。
我= imread (“bag.png”);imshow(i)标题(原始图像的)
用entropyfilt.
创建纹理图像。功能entropyfilt.
返回一个数组,其中每个输出像素包含在输入图像中的相应像素周围的9×9附近的熵值我
.熵是随机性的统计度量。
你也可以用stdfilt
和范围
以达到相似的分割结果。为比较纹理图像的局部熵,生成纹理图像年代
和R
显示本地标准偏差和局部范围。
E = entropyfilt(我);S = stdfilt(我的(9));R = rangefilt(我的(9));
用rescale.
重新缩放纹理图像E
和年代
使像素值在数据类型图像所期望的范围[0,1]双
.
EIM = Rescale(e);SIM = Rescale;
在蒙太奇中显示三个纹理图像。
蒙太奇({EIM,SIM,R},“大小”,[1 3],'背景颜色',' w ',“BorderSize”, 20)标题(“显示局部熵、局部标准差和局部范围的纹理图像”)
本例继续对熵纹理图像进行处理Eim
.您可以对其他两种类型的纹理图像重复类似的过程,以实现类似的分段结果。
阈值重新缩放的图像Eim
分割纹理。选择阈值为0.8,因为它大致沿着纹理之间的边界的像素的强度值。
BW1 = Imbinarize(EIM,0.8);imshow(bw1)标题('阈值纹理图像')
二值图像中分割的目标BW1
是白色的。如果你比较BW1
来我
,你会注意到顶部的纹理被过度分割(多个白色物体),而底部的纹理几乎被整体分割。使用。删除顶部纹理中的对象bwareaopen
.
Bwao = Bwareaopen(BW1,2000);imshow(bwao)标题(“Area-Opened纹理图像”)
用imclose
磨平边缘,并堵住物体上的任何开口BWao
.指定同一个9乘9的街区entropyfilt.
.
nhope = =那些(9);Trickbwao = Imclose(Bwao,Nhope);IMSHOW(TRESTBWAO)标题(封闭的纹理图像的)
用imfer.
填补物体上的洞closeBWao
.底部纹理的遮罩并不完美,因为遮罩没有延伸到图像的底部。但是,你可以使用蒙版来分割纹理。
掩码= imfill (closeBWao,'洞');imshow(面具);标题(“底部纹理蒙版”)
将纹理分割成两个不同的图像。
textureTop =我;textureTop(面具)= 0;textureBottom =我;textureBottom面具(~)= 0;蒙太奇({textureTop textureBottom},“大小”,[1 2],'背景颜色',' w ',“BorderSize”, 20)标题(“分割顶部纹理(左)和分割底部纹理(右)”)
创建一个标签矩阵,标签1在掩码所在的位置假
还有面具所在的标签真的
.覆盖原始图像上的标签矩阵。
L =面具+ 1;L) imshow (labeloverlay(我)标题('标记分割区域')
用青色勾勒出两个纹理之间的边界。
边界= bwperim(面具);imshow (labeloverlay(边界,我“Colormap”,[0 1 1]))标题(“纹理之间的界限”)
entropyfilt.
|bwareaopen
|imclose
|imbinarize
|imfer.
|bwperim
|范围