MATLAB中的自适应椭圆结构元素

时间:2018-04-24 22:20:39

标签: matlab ellipse mathematical-morphology

我试图为图像创建一个自适应椭圆结构元素来扩张或侵蚀它。我写这段代码但不幸的是所有的结构元素都是ones(2*M+1)

I = input('Enter the input image: ');
M = input('Enter the maximum allowed semi-major axes length: ');

% determining ellipse parameteres from eigen value decomposition of LST

row = size(I,1);
col = size(I,2);
SE = cell(row,col);
padI = padarray(I,[M M],'replicate','both');
padrow = size(padI,1);
padcol = size(padI,2);

for m = M+1:padrow-M
   for n = M+1:padcol-M

      a = (l2(m-M,n-M)+eps/l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;
      b = (l1(m-M,n-M)+eps/l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;

      if e1(m-M,n-M,1)==0
         phi = pi/2;
      else
         phi = atan(e1(m-M,n-M,2)/e1(m-M,n-M,1));
      end

      % defining structuring element for each pixel of image

      x0 = m;  
      y0 = n;
      se = zeros(2*M+1);
      row_se = 0;
      for i = x0-M:x0+M
         row_se = row_se+1;
         col_se = 0;
         for j = y0-M:y0+M
            col_se = col_se+1;
            x = j-y0;
            y = x0-i;
            if ((x*cos(phi)+y*sin(phi))^2)/a^2+((x*sin(phi)-y*cos(phi))^2)/b^2 <= 1
               se(row_se,col_se) = 1;
            end
         end
      end

      SE{m-M,n-M} = se;
   end
end

abphi是半长轴和半短轴长度,phi是a和x轴之间的角度。

我使用2个MATLAB函数来计算图像的局部结构张量,然后计算每个像素的特征值和特征向量。这些是矩阵l1l2e1e2

1 个答案:

答案 0 :(得分:0)

这是我不了解的代码:

a = (l2(m-M,n-M)+eps/l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;
b = (l1(m-M,n-M)+eps/l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;

我将b的表达式简化为(只删除索引):

b = (l1+eps/l1+l2+2*eps)*M;

对于正常范围内的l1l2,我们得到:

b =(approx)= (l1+0/l1+l2+2*0)*M = (l1+l2)*M;

因此,b很容易大于M,我认为这不是你的意图。在这种情况下,eps也不能防止被零除,这通常是添加eps的目的:如果l1为零,则eps/l1为{ {1}}。

看着这个表达式,我觉得你的意思是:

Inf

在这里,您将b = (l1+eps)/(l1+l2+2*eps)*M; 添加到每个特征值,使它们保证非零(结构张量是对称的,正半正定)。然后,您将eps除以特征值之和,再乘以l1,这会导致每个轴的M0之间的值。

所以,这似乎是一个错位的括号。

只是为了记录,这是您在代码中所需要的:

M

请注意,您可以通过在循环之外定义来简化代码:

a = (l2(m-M,n-M)+eps ) / ( l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;
b = (l1(m-M,n-M)+eps ) / ( l1(m-M,n-M)+l2(m-M,n-M)+2*eps)*M;
                     ^   ^
                added parentheses

构建[se_x,se_y] = meshgrid(-M:M,-M:M); 的内部两个循环(ij)可以简单地编写为:

se

(请注意se = ((se_x.*cos(phi)+se_y.*sin(phi)).^2)./a.^2 + ... ((se_x.*sin(phi)-se_y.*cos(phi)).^2)./b.^2 <= 1; .*运算符,这些运算符可以实现元素乘法和幂。)

通过首先从.^phi计算e1(m,n,1),然后用于调用e1(m,n,2)cos,可以进一步改善。如果我们假设特征向量被正确归一化,那么

sin

但你可以随时确保它们正常化:

cos(phi) == e1(m,n,1)
sin(phi) == e1(m,n,2)

考虑到三角运算相当昂贵,这可能会加快你的代码速度。