matlab小球图像纹理分割,使用纹理滤波器的纹理分割

读取图像

读取并显示一个挎包上的纹理图案的灰度图像。

I = imread('bag.png');

imshow(I)

title('Original Image')

aaf50aa63d8eb68a677ebdebe301242b.png

创建纹理图像

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

您还可以使用 stdfilt 和 rangefilt 来获得类似的分割结果。为了与局部熵的纹理图像进行比较,创建分别显示局部标准差和局部范围的纹理图像 S 和 R。

E = entropyfilt(I);

S = stdfilt(I,ones(9));

R = rangefilt(I,ones(9));

使用 rescale 重新缩放纹理图像 E 和 S,使像素值在数据类型为 double 的图像的预期范围 [0, 1] 内。

Eim = rescale(E);

Sim = rescale(S);

以蒙太奇方式显示三个纹理图像。

montage({Eim,Sim,R},'Size',[1 3],'BackgroundColor','w',"BorderSize",20)

title('Texture Images Showing Local Entropy, Local Standard Deviation, and Local Range')

456f1e36fcc70f98df32e6751895ce56.png

为底部纹理创建掩膜

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

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

BW1 = imbinarize(Eim,0.8);

imshow(BW1)

title('Thresholded Texture Image')

b39145f788b4cb86029a3ecfbe96b375.png

二值图像 BW1 中的分割对象是白色。如果您比较 BW1 和 I,会注意到顶部纹理过度分割(多个白色对象),底部纹理几乎整体分割。使用 bwareaopen 删除顶部纹理中的对象。

BWao = bwareaopen(BW1,2000);

imshow(BWao)

title('Area-Opened Texture Image')

05dd9beccd1b38e2e49f566b198dbb70.png

使用 imclose 对边缘进行平滑处理,并使 BWao 中对象的任何开放孔洞闭合。指定 entropyfilt 使用的相同 9×9 邻域。

nhood = ones(9);

closeBWao = imclose(BWao,nhood);

imshow(closeBWao)

title('Closed Texture Image')

d1e3327579585a38ce59ec28cc8049e2.png

使用 imfill 填充 closeBWao 中对象的孔洞。底部纹理的掩膜并不完美,因为掩膜没有延伸到图像的底部。但是,您可以使用该掩膜来分割纹理。

mask = imfill(closeBWao,'holes');

imshow(mask);

title('Mask of Bottom Texture')

d3d8248deef203c6654eb2992b2b6de4.png

使用掩膜分割纹理

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

textureTop = I;

textureTop(mask) = 0;

textureBottom = I;

textureBottom(~mask) = 0;

montage({textureTop,textureBottom},'Size',[1 2],'BackgroundColor','w',"BorderSize",20)

title('Segmented Top Texture (Left) and Segmented Bottom Texture (Right)')

1489dda273c15a9a31676da4ea9a9323.png

显示分割结果

创建一个标签矩阵,其中标签 1 的掩膜是 false,标签 2 的掩膜是 true。在原始图像上叠加标签矩阵。

L = mask+1;

imshow(labeloverlay(I,L))

title('Labeled Segmentation Regions')

eb88f48c960cf5c33e229f3ad69bad36.png

以青色显示两个纹理之间边界的轮廓。

boundary = bwperim(mask);

imshow(labeloverlay(I,boundary,"Colormap",[0 1 1]))

title('Boundary Between Textures')

b8aca840285f995f3f8ef2f50e8edf0f.png

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值