在MATLAB中使用大小为n x n的邻域对灰度图像进行形态学扩张

时间:2013-12-29 19:49:27

标签: matlab image-processing signal-processing morphological-analysis mathematical-morphology

通过将结构元素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的结构元素。

1 个答案:

答案 0 :(得分:2)

你的程序相当于使用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方形掩模的图像扩张。