在matlab中围绕一个零散的轮廓生成一个边界框
Generating a bounding box around a fragmented silhouette in matlab
您好,我正在使用 matlab。我正在尝试围绕轮廓生成边界框。这里的问题是剪影是支离破碎的
如图所示
我试过的代码是
BW=bwconncomp(image);
STATS = regionprops(BW, 'FilledArea','BoundingBox');
这给了我轮廓一部分周围的边界框。在这种情况下,我不能使用 dilate
这是首选的形态学操作,因为它将轮廓与相邻片段连接起来。
在此先感谢您的帮助。
由于您有一个包含像素索引的向量数组(bwconncomp() returns 一个结构,其中有一个名为 PixelIdxList 的成员),您可以通过查找最小 x、最小 y、最大 x,最大 y。
这是一个很好的例子:2D Minimal Bounding Box
这里有一些内容可以帮助您处理您发布的图片。我使用了一个带角度的线结构元素来放大图像并放大剪影左侧白色小块的信号。然后使用 regionprops
更容易单独识别对象和 select 具有最大面积的对象(即剪影),使用 属性 FilledArea
计算,并报告边界原始图像上的框。它可能并不完美,但它是一个开始,而且它似乎给出了一个相当不错的结果。
代码如下:
clear
clc
close all
BW = im2bw(imread('Silhouette.png'));
BW = imclearborder(BW);
%// Dilate with a line structuring element oriented at about 60 degrees to
%// amplify the elements at an angle that you don't want.
se = strel('line',5,60);
dilateddBW = imdilate(BW,se);
figure;
imshow(dilateddBW)
放大后的图像是这样的:
调用regionprops
并显示输出:
%// Get the region properties and select that with the largest area.
S = regionprops(dilateddBW,'BoundingBox','FilledArea','PixelIdxList');
boundingboxes = cat(1, S.BoundingBox);
FilledAreas = cat(1,S.FilledArea);
[~,MaxAreaIndex] = max(FilledAreas);
%// Get linear indices of the corresponding silhouette to display along
%// with its bounding box.
MaxIndices = S(MaxAreaIndex).PixelIdxList;
%// Create empty image to put the silhouette + box
NewIm = false(size(dilateddBW));
NewIm(MaxIndices) = 1;
figure;
imshow(BW)
rectangle('Position',boundingboxes(MaxAreaIndex,:),'EdgeColor','r')
输出:
希望有所帮助!
您好,我正在使用 matlab。我正在尝试围绕轮廓生成边界框。这里的问题是剪影是支离破碎的 如图所示
我试过的代码是
BW=bwconncomp(image);
STATS = regionprops(BW, 'FilledArea','BoundingBox');
这给了我轮廓一部分周围的边界框。在这种情况下,我不能使用 dilate
这是首选的形态学操作,因为它将轮廓与相邻片段连接起来。
在此先感谢您的帮助。
由于您有一个包含像素索引的向量数组(bwconncomp() returns 一个结构,其中有一个名为 PixelIdxList 的成员),您可以通过查找最小 x、最小 y、最大 x,最大 y。
这是一个很好的例子:2D Minimal Bounding Box
这里有一些内容可以帮助您处理您发布的图片。我使用了一个带角度的线结构元素来放大图像并放大剪影左侧白色小块的信号。然后使用 regionprops
更容易单独识别对象和 select 具有最大面积的对象(即剪影),使用 属性 FilledArea
计算,并报告边界原始图像上的框。它可能并不完美,但它是一个开始,而且它似乎给出了一个相当不错的结果。
代码如下:
clear
clc
close all
BW = im2bw(imread('Silhouette.png'));
BW = imclearborder(BW);
%// Dilate with a line structuring element oriented at about 60 degrees to
%// amplify the elements at an angle that you don't want.
se = strel('line',5,60);
dilateddBW = imdilate(BW,se);
figure;
imshow(dilateddBW)
放大后的图像是这样的:
调用regionprops
并显示输出:
%// Get the region properties and select that with the largest area.
S = regionprops(dilateddBW,'BoundingBox','FilledArea','PixelIdxList');
boundingboxes = cat(1, S.BoundingBox);
FilledAreas = cat(1,S.FilledArea);
[~,MaxAreaIndex] = max(FilledAreas);
%// Get linear indices of the corresponding silhouette to display along
%// with its bounding box.
MaxIndices = S(MaxAreaIndex).PixelIdxList;
%// Create empty image to put the silhouette + box
NewIm = false(size(dilateddBW));
NewIm(MaxIndices) = 1;
figure;
imshow(BW)
rectangle('Position',boundingboxes(MaxAreaIndex,:),'EdgeColor','r')
输出:
希望有所帮助!