扩张过程是通过将结构元素 B 放置在图像 A 上并以类似于卷积的方式在图像上滑动来执行的。
我理解灰度图像的数学形态学膨胀背后的主要概念,但我仍然有一个问题:
结构元素的值可以不由用户选择吗?换句话说,我们是否可以通过只选择结构元素的大小和形状而不指定其元素来对图像进行膨胀处理?
为了更精确,我将通过一个例子很好地解释我的问题:假设一个大小为
I
的灰度图像 160 x 160
要由大小为 8 x 8 的邻域进行处理(在本例中为扩展)。我没有指定这个邻域的元素,所以它们的元素来自图像本身。例如我写了下面的 matlab 代码:
Max_image = max_filter(I, [0 0 7 7]);
函数max_filter是:
[n m] = size(I); % n=160 and m=160
B = I;
for i = 1:m-7,
B(:,i) = max(I(:,i:i+7),[],2);
end
for i=m-7+1:m
B(:,i) = max(I(:,i:min(end,i+7),[],2);
end
for i = 1:n-7,
I(i,:) = max(B(max(1,i):min(end,i+7),:),[],1);
end
for i = n-7+1:n,
I(i,:) = max(B(i:min(end,i+7),:),[],1);
end
这仍然被认为是形态学膨胀操作吗?回想一下,我使用了大小为 8 x 8 的结构元素。
您的程序相当于结构元素为
ones(8)
的完整图像膨胀(顺便说一句,您没有使用输入参数 [0 0 7 7],而且您确实不需要):
I = [92 99 1 8 15 67 74 51 58 40
98 80 7 14 16 73 55 57 64 41
4 81 88 20 22 54 56 63 70 47
85 87 19 21 3 60 62 69 71 28
86 93 25 2 9 61 68 75 52 34
17 24 76 83 90 42 49 26 33 65
23 5 82 89 91 48 30 32 39 66
79 6 13 95 97 29 31 38 45 72
10 12 94 96 78 35 37 44 46 53
11 18 100 77 84 36 43 50 27 59];
Max_image = max_filter(I, [0 0 7 7])
会给你:
99 99 97 97 97 75 75 75 72 72
98 97 97 97 97 75 75 75 72 72
100 100 100 97 97 75 75 75 72 72
100 100 100 97 97 75 75 75 72 72
100 100 100 97 97 75 75 75 72 72
100 100 100 97 97 72 72 72 72 72
100 100 100 97 97 72 72 72 72 72
100 100 100 97 97 72 72 72 72 72
100 100 100 96 84 59 59 59 59 59
100 100 100 84 84 59 59 59 59 59
当您使用时:
J1=imdilate(I,ones(8),'full');
J1(8:end,8:end)
它会给你完全相同的答案。
这就是为什么我昨天告诉你,通常使用二值图像掩模作为结构元素。您不需要选择掩码内的值,但需要选择大小(8*8)和形状。什么是形状?在二值图像中,填充1的元素决定了形状。在您的代码中,您选择了 8*8 区域内的最大值,这相当于使用整个明亮的 8*8 方形掩模进行图像膨胀。