0

我正在尝试从图像中提取边缘。我使用了以下算法。还给出了 512 * 512 灰度图像的输入图像(e11)。

  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' ,我收到如下错误

“'struct' 类型的输入参数的未定义函数 'minus'”。

是否可以使用“bwconncomp”函数来查找最大的连接区域?是否有任何替代函数?请帮助我更正此代码。提前致谢。

4

1 回答 1

2

您假设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它,它返回一个标签映射,该映射用唯一 ID 标记每个不同的对象。第二个输出bwlabel返回检测到的对象数量。

我会使用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);
于 2015-03-14T06:06:56.060 回答