计算图像边缘时出错
Error while calculating the edge of an image
我正在尝试从图像中提取边缘。我使用了下面的algorithm.Input image(e11) 也给出了512 * 512灰度图像。
- 求输入图像的形态梯度(gradientim)
- 求梯度图像的负像(negativeim)
- 使用底帽变换 (bottomhatim) 从闭合图像中减去原始图像。
- 计算输入图像的平均像素(AVG)
- 根据AVG求二值图像,使图像平滑
- 找到最大的连通区域以找到更大的对象(CC)。
- 从平滑图像(边缘)中减去最大区域。
我写的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);
我正在尝试从图像中提取边缘。我使用了下面的algorithm.Input image(e11) 也给出了512 * 512灰度图像。
- 求输入图像的形态梯度(gradientim)
- 求梯度图像的负像(negativeim)
- 使用底帽变换 (bottomhatim) 从闭合图像中减去原始图像。
- 计算输入图像的平均像素(AVG)
- 根据AVG求二值图像,使图像平滑
- 找到最大的连通区域以找到更大的对象(CC)。
- 从平滑图像(边缘)中减去最大区域。
我写的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);