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
相关产品推荐
相关产品推荐

