【问题标题】:What is the result of dilation of this image?这张图片膨胀的结果是什么?
【发布时间】:2018-01-07 19:31:03
【问题描述】:

我有以下矩阵:

 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 1     1     0     0     0     0     0
 1     0     0     0     0     1     1
 1     0     0     0     0     1     1

我想用下面的结构元素来扩展它:

 1     0     0
 1     1     1
 1     1     1

我已经在 Matlab 上进行了膨胀,但结果与我手动做的不匹配。所以我想我在这里遗漏了一些东西。据我所知,如果结构元素的任何“1”触及矩阵中的任何“1”,则意味着它是命中,当前窗口的中心应设置为 1。如果我在这种时尚我会得到关注(不考虑边缘):

 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     1     1     0     0     0     0
 1     1     1     0     1     1     0
 1     1     1     0     1     1     1
 1     0     0     0     0     1     1

但是Matlab给出了以下结果:

 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 0     0     0     0     0     0     0
 1     **0**     **0**     0     0     0     0
 1     1     1     0     1     1     0
 1     1     1     0     1     1     1
 1     1     0     0     1     1     1

在不考虑边缘的情况下,它几乎看起来像我的结果,但用粗体样式设置的像素在我的结果中为“1”,但在 Matlab 的结果中为“0”。我究竟做错了什么?那些'0'下面的像素是原始图像中的'1',当窗口的中心在那些'0'上时,结构元素在那个空间有'1',所以它是一个命中并且中心必须设置为'1'但是Matlab 不这样做。谁能解释我为什么?我在这里遗漏了一些重要的东西吗?

【问题讨论】:

  • 展示你是如何做到的......
  • 有两种等效的方法来定义膨胀。下面是 Somaye 使用的那个,还有你的。为了使这两个等效,您需要在两个定义之一中镜像结构元素。似乎是您的定义需要镜像 SE 来匹配 MATLAB 使用的定义。不同的作者对它的定义不同,这很好。

标签: matlab image-processing image-morphology


【解决方案1】:

假设矩阵 A 是您的图像,矩阵 B 是结构元素。您应该在矩阵 A 的所有边上填充零。因此,假设您有矩阵 C。那么您应该对 C 和 B 执行逻辑与运算。称为 D 的结果矩阵将是一个扩张矩阵。欲了解更多信息,请参阅here. 这是 Matlab 的代码,它在没有 'imdilate' 功能的情况下放大图像:

clc;clearvars;close all;
%Image Dilation without using 'imdilate' function
% Matrix A is our image
A=[0 0 0 0 0 0 0;
    0 0 0 0 0 0 0;
    0 0 0 0 0 0 0 ;
    0 0 0 0 0 0 0;
    1 1 0 0 0 0 0;
    1 0 0 0 0 1 1 ;
    1 0 0 0 0 1 1 ];
%Structuring element
B=[1 0 0; 1 1 1; 1 1 1];
%Pad zeros on all the sides
C=padarray(A,[1 1]);
%Intialize a matrix of matrix size A with zeros
D=false(size(A));
for i=1:size(C,1)-2
    for j=1:size(C,2)-2
        %Perform logical AND operation
        D(i,j)=sum(sum(B&C(i:i+2,j:j+2)));
    end
end

display(D);

这是我的输出,扩张矩阵 D:

【讨论】:

  • 我在 (6,0) 处的输出为 0 而不是 1,您能验证一下吗?
  • @flamelite,你用什么方法来膨胀矩阵?还是您确实运行了代码?还是手动运行?很抱歉,但我没有得到你的评论。
  • 感谢您的回复,我做错了,我想通了。
猜你喜欢
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多