我只是在阅读图像并希望可视化由matlab的blob分析返回的边界框,该分析框返回位置向量。 这是我的代码
img = imread(file_name);
img = im2bw(img);
gblob = vision.BlobAnalysis('AreaOutputPort', true, ... % Set blob analysis handling
'CentroidOutputPort', true, ...
'BoundingBoxOutputPort', true', ...
'MinimumBlobArea', 0, ...
'MaximumBlobArea', 600000, ...
'MaximumCount', 1000, ...
'MajorAxisLengthOutputPort',true, ...
'MinorAxisLengthOutputPort',true, ...
'OrientationOutputPort',true);
[Area,centroid, bbox, MajorAxis, MinorAxis,Orientation] = step(gblob, img);
% each bbox is position vector of the form [x y width height]
for i = 1:1:length(MajorAxis)
figure;imshow(img(bbox(i,2):bbox(i,2) + bbox(i,4),bbox(i,1):bbox(i,1)+bbox(i,3)));
end
这样做我收到错误Index exceeds matrix dimensions.
我也尝试了
figure;imshow(img(bbox(i,1):bbox(i,1) + bbox(i,3),bbox(i,2):bbox(i,2)+bbox(i,4)));
但我仍然得到同样的错误。
这是一个示例图像,此代码给出了错误
答案 0 :(得分:3)
这是错误索引的简单案例。斑点检测器返回blob左上角的x
和y
坐标。在这种情况下,x
是水平坐标,而y
是垂直。因此,您只需要交换图像的方式,因为垂直需要先到,然后是水平。
另外关于你的图像,我会反转图像,因为一旦你将它转换为二进制,该对象将被视为白色背景上的暗物体。斑点检测器通过检测黑色背景上的白色物体来工作。因此,反转图像并进行一些形态学关闭以在发生噪声时清除噪声:
img = imread('http://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg');
img = ~im2bw(img); %// Change - invert
img_clean = imclose(img, strel('square', 7)); %// Change, clean the image
我现在收到这张图片:
imshow(img_clean);
不错....现在运行你的实际blob探测器。请注意,放在blob检测器中的图像是运行变量名称。您现在需要将其称为img_clean
:
gblob = vision.BlobAnalysis('AreaOutputPort', true, ...
'CentroidOutputPort', true, ...
'BoundingBoxOutputPort', true', ...
'MinimumBlobArea', 0, ...
'MaximumBlobArea', 600000, ...
'MaximumCount', 1000, ...
'MajorAxisLengthOutputPort',true, ...
'MinorAxisLengthOutputPort',true, ...
'OrientationOutputPort',true);
[Area,centroid, bbox, MajorAxis, MinorAxis,Orientation] = step(gblob, img_clean);
现在终于提取出每个blob:
% each bbox is position vector of the form [x y width height]
for i = 1:1:length(MajorAxis)
figure;
imshow(img_clean(bbox(i,2):bbox(i,2) + bbox(i,4),bbox(i,1):bbox(i,1)+bbox(i,3))); %// Change
end
我现在得到以下9个数字:
请注意,上述情况并不完美,因为标志的周长已断开,因此斑点检测器会将其解释为不同的斑点。解决此问题的一种方法是改变图像的阈值,或者使用graythresh
执行自适应阈值处理,这样可以确保边框连接正确。但是,这是开始解决问题的好方法。
更简单的方法是取消使用计算机视觉工具箱并使用图像处理工具箱。具体使用regionprops
并使用Image
属性来提取blob自己包含的实际图像:
%// Code from before
img = imread('http://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg');
img = ~im2bw(img); %// Change - invert
img_clean = imclose(img, strel('square', 7)); %// Change, clean the image
%// Create regionprops structure with desired properties
out = regionprops(img_clean, 'BoundingBox', 'Image');
%// Cycle through each blob and show the image
for ii = 1 : numel(out)
figure;
imshow(out(ii).Image);
end
这应该与我在上面展示的相同。您可以查看文档以获取有关每个blob为您返回的regionprops
类型属性的更多详细信息。