遍历数组矩阵matlab

loop over array matrix matlab

我正在检测图像中的圆圈。 I return 圆半径和轴的 X,Y。我知道如何裁剪 1 个圆,公式没有问题: X-radius, Y-radius, width=2*r,height=2*r 使用 imcrop。 我的问题是当我得到 returned 超过 1 个圆圈时。 我在数组 radiiarray 中得到 returned 圆半径。 我在 centarray 中得到 returned 圆心。 当我disp(centarray)时,它看起来像这样:

146.4930  144.4943
610.0317  142.1734

当我检查 size(centarray)disp 时,我得到:

2 2

所以我知道第一列是 X,第二列是 Y 轴值。所以第一个圆心是 146,144。 我制作了一个仅适用于 1 个圆圈的循环。 “--------”是我不确定使用什么来获取的地方: 注意:半径 = r

第一圈)

            X = centarray(1)-r;
            Y = centarray(3)-r;
            Width =2*r;
            Width =2*r;

第二圈)

            X = centarray(2);
            Y = centarray(4);
            Width =2*r;
            Width =2*r;

我将如何修改代码的“------”部分?我也希望如果有 3 个以上的圆圈,循环会起作用,因为我有时会从图像中获得多达 9 个圆圈。

B = imread('p5.tif');
centarray = [];
centarray = [centarray,centers];
radiiarray = [];
radiiarray = [radiiarray,radii];

for j=1:length(radiiarray)

x = centarray((------))-radiiarray(j); %X value to crop
y = centarray((------))-radiiarray(j);    %Y value to crop

width = 2*radiiarray(j);            %WIDTH
height = 2*radiiarray(j);           %HEIGHT

K = imcrop(B, [x y width height]);
end

我的完整代码不起作用,因为当我看到值的存储方式时我意识到为什么...:[=​​24=]

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DETECT + GET X Y WIDTH HEIGHT OF CIRCLES
I = imread('p5.tif');
subplot(2,2,1);imshow(I);title('Original Image'); 
%sharpen edges
B = imsharpen(I);
subplot(2,2,2);imshow(B);title('sharpened edges');


%find circles
Img = im2bw(B(:,:,3));
minRad = 20;
maxRad = 90;
[centers, radii] = imfindcircles(Img, [minRad maxRad], ...
                                    'ObjectPolarity','bright','sensitivity',0.84);
imagesc(Img);
viscircles(centers, radii,'Color','green');
%nuber of circles found


%arrays to store values for radii and centers
centarray = [];
centarray = [centarray,centers];
radiiarray = [];
radiiarray = [radiiarray,radii];
sc = size(centarray);
disp(sc)
disp(centarray)
disp(radiiarray)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%CROP USING VALUE FROM ARRAYS NUMBER OF TIMES THERE ARE CENTERS(number of
%circles)


for j=1:length(radiiarray)


    x = centarray((2*j)-1)-radiiarray(j); %X value to crop
    y = centarray((2*j))-radiiarray(j);    %Y value to crop 
    width = 2*radiiarray(j);            %WIDTH
    height = 2*radiiarray(j);           %HEIGHT
    disp(x)
    disp(y)
    disp(centarray)
    %crop using values
    K = imcrop(B, [x y width height]);
    %togray
    gray = rgb2gray(K);
    subplot(2,2,3);imshow(K);title('cropped before bw');
    Icorrected = imtophat(gray, strel('disk', 15));
    %to black and white
    black = im2bw(Icorrected);
    subplot(2,2,4);imshow(black);title('sharpened edges');
    %read
    results = ocr(black); 
    number = results.Text;
    %display value
    disp(number)

end

感谢任何关于如何创建这种循环的帮助,因为我没有更多的想法或找不到答案..

编辑 解决方案

嗨,答案是将矩阵视为二维。

for j=1:length(radiiarray)
x=centarray(j,1)
y=centarray(j,2)
width = radiiarray(j)
height = radiiarray(j)
end

随着 j 的增加,值现在会正确更新。

答案是将矩阵视为二维。

for j=1:length(radiiarray)
x=centarray(j,1)
y=centarray(j,2)
width = radiiarray(j)
height = radiiarray(j)
end

随着 j 的增加,值现在会正确更新。

感谢@beaker 的评论!这就是为什么我想通了