循环数组矩阵matlab
Posted
技术标签:
【中文标题】循环数组矩阵matlab【英文标题】:loop over array matrix matlab 【发布时间】:2017-04-20 00:27:37 【问题描述】:我正在检测图像中的圆圈。我返回轴的圆半径和 X,Y。我知道如何裁剪 1 个圆圈,公式没有问题:
X-radius, Y-radius, width=2*r,height=2*r
使用 imcrop
。
我的问题是当我返回超过 1 个圆圈时。
我在数组radiiarray
中返回圆半径。
我在centarray
中得到了返回的圆心。
当我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
我的完整代码不起作用,因为当我看到值的存储方式时,我意识到为什么...:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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 的增加,值现在会正确更新。
【问题讨论】:
如果您将数组视为二维数组,它会让您的生活更轻松。对于第一个圆,圆心为centarray(1,1)
,半径为centarray(1,2)
。对于第二个圆,圆心为centarray(2,1)
,半径为centarray(2,2)
。见mathworks.com/help/matlab/learn_matlab/array-indexing.html
【参考方案1】:
答案是将矩阵视为二维。
for j=1:length(radiiarray)
x=centarray(j,1)
y=centarray(j,2)
width = radiiarray(j)
height = radiiarray(j)
end
随着 j 的增加,值现在会正确更新。
感谢@beaker 的评论!这就是我想出来的原因
【讨论】:
以上是关于循环数组矩阵matlab的主要内容,如果未能解决你的问题,请参考以下文章