You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab形态学膨胀算子未输出预期结果的技术问询

问题分析与解决方案

首先得明确一个关键知识点:Matlab里的imdilate默认是对**非零像素(也就是你图像里的白色区域)**进行膨胀操作的,而你想要放大的是黑色区域(零值像素),这就搞反了操作方向,所以结果不符合预期。

咱们先理清楚你的原始图像:

  • 10x10的二值图,大部分区域是白色(值为1)
  • 中间6x6的区域是黑色(值为0),还在这个黑色区域里挖了四个白色小方块((4,4),(4,7),(7,4),(7,7))

你现在的代码用imdilate是让白色区域向外扩张,自然会挤压黑色区域的空间,和你想要的放大黑色区域完全相反。

解决方法有两种,选哪种都可以:

方法1:对图像取反后做膨胀,再取反回来

把黑色区域变成白色(取反后,0变1,1变0),此时膨胀白色区域就是放大原来的黑色区域,最后再取反恢复颜色逻辑:

bin = ones(10,10, 'uint8'); 
bin(3:8, 3:8) = 0; 
bin([4 7], [4 7]) = 1; 
nhood = [1 0 1; 0 0 0; 1 0 1]; 

% 修改后的代码:取反→膨胀→取反
dil_inv = imdilate(1-bin, strel(nhood));
dil = 1 - dil_inv;

figure; 
subplot(1,2,1) 
imshow(255*bin, 'InitialMagnification', 'fit')
title('原始图像')
subplot(1,2,2) 
imshow(255*dil, 'InitialMagnification', 'fit')
title('黑色区域放大后的图像')

方法2:直接使用腐蚀操作(imerode)

腐蚀操作是缩小前景(白色区域),相当于间接放大背景(黑色区域),正好匹配你的需求:

bin = ones(10,10, 'uint8'); 
bin(3:8, 3:8) = 0; 
bin([4 7], [4 7]) = 1; 
nhood = [1 0 1; 0 0 0; 1 0 1]; 

% 修改后的代码:用imerode替代imdilate
dil = imerode(bin, strel(nhood));

figure; 
subplot(1,2,1) 
imshow(255*bin, 'InitialMagnification', 'fit')
title('原始图像')
subplot(1,2,2) 
imshow(255*dil, 'InitialMagnification', 'fit')
title('黑色区域放大后的图像')

两种方法最终都会让你的黑色区域按照结构元素的形状向外扩张,达到你预期的效果。

内容的提问来源于stack exchange,提问作者sci9

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:13:47