MATLAB:图像角点坐标并参考单元格数组
我在比较不同单元格数组中的元素时遇到一些问题。
这个问题的背景是我正在使用MATLAB中的bwboundaries函数来跟踪图像的轮廓。该图像具有结构性横截面,我试图确定整个横截面是否连续(即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 (ie 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);
更多&回答...