计算图像边缘时出错

Error while calculating the edge of an image

我正在尝试从图像中提取边缘。我使用了下面的algorithm.Input image(e11) 也给出了512 * 512灰度图像。

  1. 求输入图像的形态梯度(gradientim)
  2. 求梯度图像的负像(negativeim)
  3. 使用底帽变换 (bottomhatim) 从闭合图像中减去原始图像。
  4. 计算输入图像的平均像素(AVG)
  5. 根据AVG求二值图像,使图像平滑
  6. 找到最大的连通区域以找到更大的对象(CC)。
  7. 从平滑图像(边缘)中减去最大区域。

我写的matlab代码如下

e11 = imread("lena.jpg");
e11= double(e11);
gradientim = imdilate(e11,se) - imerode(e11,se);
negativeim = imcomplement(gradientim);
bottomhatim = imclose(negativeim,se) -  e11 ;
AVG = mean2(e11);
%-------Computing binary image--------
for i=1:(height)
     for j=1:(width)
         if(AVG > bottomhatim(i,j,:))
              bottomhatim(i,j,:) = 1;
         else
              bottomhatim(i,j,:) = 0;
         end
     end
end
CC = bwconncomp(bottomhatim);
edge = bottomhatim - CC;

在执行第 7 步时,由于连接组件 (CC) 的类型是 'struct' ,我收到如下错误消息

"Undefined function 'minus' for input arguments of type 'struct'".

"bwconncomp"函数可以用来求最大连通区域吗?有什么替代函数吗?请提前帮我更正这个code.Thanks

您假设 CC 是一个数组,但它实际上是一个结构。具体来说,这就是文档所说的 bwconncomp:

 bwconncomp Find connected components in binary image.
    CC = bwconncomp(BW) returns the connected components CC found in BW. 
    BW is a binary image that can have any dimension. CC is a structure 
    with four fields:

       Connectivity   Connectivity of the connected components (objects).

       ImageSize      Size of BW.

       NumObjects     Number of connected components (objects) in BW.

       PixelIdxList   1-by-NumObjects cell array where the kth element
                      in the cell array is a vector containing the linear
                      indices of the pixels in the kth object.

根据您的算法描述,您希望找到最大的连通分量并将其从图像中减去以获得存储在 edge 中的最终图像。我建议您改用 bwlabel,其中 returns 是一个标签映射,它用唯一 ID 标记每个不同的对象。 bwlabel的第二个输出returns检测到多少对象

我会使用 bwlabel,结合 histc 来计算每个区域有多少像素。我们将使用它来确定面积最大的区域。然后你会制作一个由这个对象组成的蒙版,然后使用它并减去你的图像以获得最终输出 edge.

具体来说,在代码末尾执行此操作:

%// Do bwlabel on image
[L, num] = bwlabel(bottomhatim);

%// Count how many values belong to each object, ignoring background
counts = histc(L(:), 1:num);

%// Find which object gives us the largest area
[~,max_id] = max(counts);

%// Make a mask and then subtract
CC = L == max_id;
edge = imsubtract(bottomhatim, CC);