gpt4 book ai didi

MATLAB:图像角坐标和对元胞数组的引用

转载 作者:行者123 更新时间:2023-12-04 06:56:51 24 4
gpt4 key购买 nike

我在比较不同单元格数组中的元素时遇到了一些问题。

这个问题的背景是我正在使用 bwboundaries MATLAB 中的函数来跟踪图像的轮廓。该图像是结构横截面,我试图找出整个截面是否具有连续性(即 bwboundaries 命令仅生成一个轮廓)。

完成此操作并找到跟踪的不止一个部分(即它不连续)后,我使用了 cornermetric命令来找到每个部分的角落。

我的代码是:

%% Define the structural section as a binary matrix (Image is an I-section with the web broken)
bw(20:40,50:150) = 1;
bw(160:180,50:150) = 1;
bw(20:60,95:105) = 1;
bw(140:180,95:105) = 1;

Trace = bw;
[B] = bwboundaries(Trace,'noholes'); %Traces the outer boundary of each section

L = length(B); % Finds number of boundaries
if L > 1
disp('Multiple boundaries') % States whether more than one boundary found
end

%% Obtain perimeter coordinates
for k=1:length(B) %For all the boundaries
perim = B{k}; %Obtains perimeter coordinates (as a 2D matrix) from the cell array
end

%% Find the corner positions
C = cornermetric(bw);

Areacorners = find(C == max(max(C))) % Finds the corner coordinates of each boundary

[rowindexcorners,colindexcorners] = ind2sub(size(Newgeometry),Areacorners)
% Convert corner coordinate indexes into subcripts, to give x & y coordinates (i.e. the same format as B gives)

%% Put these corner coordinates into a cell array
Cornerscellarray = cell(length(rowindexcorners),1); % Initialises cell array of zeros
for i =1:numel(rowindexcorners)
Cornerscellarray(i) = {[rowindexcorners(i) colindexcorners(i)]};
%Assigns the corner indicies into the cell array
%This is done so the cell arrays can be compared
end

for k=1:length(B) %For all the boundaries found
perim = B{k}; %Obtains coordinates for each perimeter
Z = perim; % Initialise the matrix containing the perimeter corners

Sectioncellmatrix = cell(length(rowindexcorners),1);
for i =1:length(perim)
Sectioncellmatrix(i) = {[perim(i,1) perim(i,2)]};
end

for i = 1:length(perim)
if Sectioncellmatrix(i) ~= Cornerscellarray
Sectioncellmatrix(i) = [];
%Gets rid of the elements that are not corners, but keeps them associated with the relevent section
end
end
end

这会在最后一个 for 循环中产生错误。有没有办法可以检查数组的每个单元格(包含 x 和 y 坐标)是否等于cornercellarray 中的任何一对坐标?我知道矩阵可以比较某个元素是否与另一个矩阵中的任何元素匹配。我希望能够在这里做同样的事情,但对于元胞数组内的坐标对。

我不只是使用cornercellarray 元胞数组本身的原因是因为它列出了所有的角坐标,并且没有将它们与特定的跟踪边界相关联。

最佳答案

不能使用等号进行多对多比较。您需要改用 ismember。

%# catenate all corners in one big corner array
Cornerscellarray = cat(1,Cornerscellarray{:});

%# loop through each section cell and remove all that is not corners
for i = 1:length(perim)
%# check for corners
cornerIdx = ismember(Sectioncellmatrix{i},Cornerscellarray,'rows');

%# only keep good entries
Sectioncellmatrix{i} = Sectioncellmatrix{i}(cornerIdx,:);
end

此外,这段代码看起来确实可以优化一下。例如,您可以使用 bwlabel 来标记您的数组,读取带有角坐标的标签以将角与特征相关联。

像这样:
bw(20:40,50:150) = 1;
bw(160:180,50:150) = 1;
bw(20:60,95:105) = 1;
bw(140:180,95:105) = 1;

%# get corners
cornerProbability = cornermetric(bw);
cornerIdx = find(cornerProbability==max(cornerProbability(:)));

%# Label the image. bwlabel puts 1 for the first feature, 2 for the second, etc.
%# Since concave corners are placed just outside the feature, grow the features
%# a little before labeling
bw2 = imdilate(bw,ones(3));
labeledImage = bwlabel(bw2);

%# read the feature number associated with the corner
cornerLabels = labeledImage(cornerIdx);

%# find all corners that are associated with feature 1
corners_1 = cornerIdx(cornerLabels==1);

关于MATLAB:图像角坐标和对元胞数组的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2462927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com