在尝试访问位置向量时,索引超出矩阵维度

时间:2016-05-04 18:52:51

标签: image matlab image-processing matrix matlab-cvst

我只是在阅读图像并希望可视化由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)));

但我仍然得到同样的错误。

这是一个示例图像,此代码给出了错误

https://www.aagga.com/wp-content/uploads/2016/02/Sample.jpg

1 个答案:

答案 0 :(得分:3)

这是错误索引的简单案例。斑点检测器返回blob左上角的xy坐标。在这种情况下,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);

enter image description here

不错....现在运行你的实际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个数字:

enter image description here

请注意,上述情况并不完美,因为标志的周长已断开,因此斑点检测器会将其解释为不同的斑点。解决此问题的一种方法是改变图像的阈值,或者使用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类型属性的更多详细信息。