这可能有点长,但看看你是否有耐心会很有趣。
Allvectors 是一个单元格数组,包含北(n),南(s),东(e)和西(w)面周围的矢量点(边)(见每个内部节点都有一个箭头或“X”标记。
接触点(以红点显示)是包含1,2和3像素标签作为其邻居的节点。
xpoint1 是一个包含所有接触点每个面上所有向量的单元格数组。
x-point1是具有标签1和2的相邻像素的面,使得矢量方向为“A +”或“A-”,具体取决于标签2的方向。这对于像素标签3是相同的和2,使得矢量方向是“B +”或“B - ”。
到目前为止我尝试了什么:
我能够找到尽可能多的x点,代码运行成功。但是,我这样做的方式看起来相当麻烦,因为我不断为每个要找到的新x点重写程序,这导致了太多的函数和变量。而且,这使得我找到了“A”和“B”矢量的相同数量的x点,而我已经意识到x点的数量不一定必须相同。
请参阅以下代码:
clc; clear; close all;
Img = [3 3 3 2 2
3 3 3 2 2
3 1 2 2 2
1 1 2 2 2
1 1 1 1 2];
%%%%%% Plot the image
figure, imshow(Img, [], 'InitialMagnification','fit')
grid on;
hold on;
%# Find the size of the image
[row, col] = size(Img);
%# Obtain total no. of internal x and y node points
ny = row - 1; nx = col - 1;
%%%%%%%%%%% Obtain full output grids
[gridy, gridx] = meshgrid(1:ny, 1:nx);
coords = [gridy(:), gridx(:)];
%%%%%%%% Obtain node counts
nodecount = nx*(coords(:,1)-1) + coords(:,2);
%%%%%%%%%%% Compute the vectors around each node
%%%%% firstly create a cell array to store your vectors
Allvectors = cell(ny*nx, 4);
for nodecount = 1:ny*nx;
%%%%%% determine the x and y-coords of each node
[node_y, node_x] = get_xycoord_from_nodecount(nx, nodecount);
%%%%%% compute vectors at each face around each node
[n, s, e, w] = find_vectors(node_y, node_x, Img);
Allvectors{nodecount,1} = n;
Allvectors{nodecount,2} = s;
Allvectors{nodecount,3} = e;
Allvectors{nodecount,4} = w;
end
%%%%%%% Determine the contactpoint nodes
cpNodes = find(( any(strcmp('A+', Allvectors),2) | any(strcmp('A-', Allvectors),2)) & (any(strcmp('B+', Allvectors),2) | any(strcmp('B-', Allvectors),2)))
%%%%%%% find the node as well as coordinates of the contactpoints
nodecount = cpNodes;
[node_y, node_x] = get_xycoord_from_nodecount(nx, nodecount);
%%%%%%% find all other x-points around cp
%# extract vectors for all x-points for pixel label 1
xpoint1 = Allvectors(cpNodes,:);
%# create an empty cell array wherein the vectors around the faces of each new node will be stored
xpt2_labelA = cell(numel(cpNodes), 4);
xpt3_labelA = cell(numel(cpNodes), 4);
for ii = 1: numel(cpNodes)
%# COMPUTATIONS FOR pixel label 1
%%%%%% Determine the face where the 1st x-point (i.e. x-point1) lies
Idx1_labelA(ii,:) = find(strcmp('A+', xpoint1(ii,:)) | strcmp('A-', xpoint1(ii,:)))
%%%%%% Determine the face where the 2nd x-point (i.e. x-point2) lies
%# firstly find the next Node from the previous
[xpt2_labelA, a, node_Anext] = find_node_next(ii, nodecount, nx, Idx1_labelA, xpt2_labelA, Allvectors);
%%%%%% find all possible face(s) where x-point2 lies for both Solid phase
if find(strcmp('A+', xpt2_labelA(ii,:)) | strcmp('A-', xpt2_labelA(ii,:))) > 0
Idx2_labelA(ii,:) = find(strcmp('A+', xpt2_labelA(ii,:)) | strcmp('A-', xpt2_labelA(ii,:)));
else
continue
end
%%%%%% Determine the face where the 3rd x-point (i.e. x-point2) lies
% repeat the steps for x-point2, however, rename the indices and cell
% arrays with 2 or 3 where appropriate
%# COMPUTATIONS FOR pixel label 3
%%%%%% Determine the face where the 1st x-point (i.e. x-point1) lies
Idx1_labelB(ii,:) = find(strcmp('B+', xpoint1(ii,:)) | strcmp('B-', xpoint1(ii,:)));
%%%%%%%%%%%%%%%%%%%%%%%%%%%% COLLATE vectors from all X-Points found:
%# Average unit vector 'A'
Va = [(ya1 + ya2 +... yan)/Na, (xa1 + xa2 +... xan)/Na]; % Na=total no. of X-points collated for vector A within the specified neighborhood.
%# Average unit vector 'B'
Vb = [(yb1 + yb2 +... ybn)/Nb, (xb1 + xb2 +... xbn)/Nb]; % Nb=total no. of X-points collated for vector B within the specified neighborhood.
%where: ya, yb, xa, xb are components of the vectors in the directions observed
%as an example: from the arrow shown, ya1=0, and xa1=1
%%%%%%%%% Compute angle between average unit vectors A and B
angle(ii) = 180 - ( acos( dot(Va(ii,:), Vb(ii,:)) / (norm(Va(ii,:)) * norm(Vb(ii,:)) ) ) * 180/pi );
angle(:, ii) = angle(ii);
end
功能
function[node_y, node_x] = get_xycoord_from_nodecount(nx, nodecount)
%This function obtains the x and y coordinates from nodecount
node_x = mod(nodecount - 1, nx) + 1;
node_y = (nodecount - node_x)/nx + 1;
end
function [n, s, e, w] = find_vectors(node_y, node_x, Img)
%This function determines if a vector exists at the north, south,
%east and western faces around each node.
%If a normal vector exists at any of these faces,
%the function determines if it is an 'A+', 'A-', 'B+', or a 'B-'
%
%Where '+/-' is for +ve or -ve x or y-direction, and 'A' or 'B' tells if it
%is a vector resulting from a pixel labels 1|2, or 3|2
n = NaN; s = NaN; e = NaN; w = NaN;
%# NORTH FACE
if Img(node_y, node_x + 1) == 2
if Img(node_y, node_x) == 1
n = 'A+';
elseif Img(node_y, node_x) == 3
n = 'B+';
end
elseif Img(node_y, node_x) == 2
if Img(node_y, node_x + 1) == 1
n = 'A-';
elseif Img(node_y, node_x + 1) == 3
n = 'B-';
end
end
%# SOUTH FACE
if Img(node_y + 1, node_x + 1) == 2
if Img(node_y + 1, node_x) == 1
s = 'A+';
elseif Img(node_y + 1, node_x) == 3
s = 'B+';
end
elseif Img(node_y + 1, node_x) == 2
if Img(node_y + 1, node_x + 1) == 1
s = 'A-';
elseif Img(node_y + 1, node_x + 1) == 3
s = 'B-';
end
end
%# EAST FACE
if Img(node_y + 1, node_x + 1) == 2
if Img(node_y, node_x + 1) == 1
e = 'A+';
elseif Img(node_y, node_x + 1) == 3
e = 'B+';
end
elseif Img(node_y, node_x + 1) == 2
if Img(node_y + 1, node_x + 1) == 1
e = 'A-';
elseif Img(node_y + 1, node_x + 1) == 3
e = 'B-';
end
end
%# WEST FACE
if Img(node_y + 1, node_x) == 2
if Img(node_y, node_x) == 1
w = 'A+';
elseif Img(node_y, node_x) == 3
w = 'B+';
end
elseif Img(node_y, node_x) == 2
if Img(node_y + 1, node_x) == 1
w = 'A-';
elseif Img(node_y + 1, node_x) == 3
w = 'B-';
end
end
end
function [xpt2_labelA, a, node_Anext] = find_node_next(ii, nodecount, nx, Idx1_labelA, xpt2_labelA, Allvectors)
if Idx1_labelA(ii,:) == 1 %# xpoint1 lies on the north face
%%%%% Find the node at the northern end of the face which contains xpoint1
node_Anext(ii,:) = nodecount(ii,:) - nx;
%%%%%% extract the n, s, e, w faces from AllNormalvectors
a = Allvectors(node_Anext(ii,:),:);
%%%%%% store the new results (exclude the existing result at the southern face of the node northofCP)
xpt2_labelA{ii,1} = a{1};
xpt2_labelA{ii,2} = NaN;
xpt2_labelA{ii,3} = a{3};
xpt2_labelA{ii,4} = a{4};
elseif Idx1_labelA(ii,:) == 2 %# xpoint1 lies on the south face
%%%%% Find the node at the southern end of the face which contains xpoint1
node_Anext(ii,:) = nodecount(ii,:) + nx;
%%%%%% extract n, s, e, w faces from AllNormalvectors
a = Allvectors(node_Anext(ii,:),:);
%%%%%% store the new results (exclude the node at the northern face of the node southofCP)
xpt2_labelA{ii,1} = NaN;
xpt2_labelA{ii,2} = a{2};
xpt2_labelA{ii,3} = a{3};
xpt2_labelA{ii,4} = a{4};
elseif Idx1_labelA(ii,:) == 3 %# xpoint1 lies on the east face
%%%%% Find the node at the eastern end of the face which contains xpoint1
node_Anext(ii,:) = nodecount(ii,:) + 1;
%%%%%% extract n, s, e, w faces from AllNormalvectors
a = Allvectors(node_Anext(ii,:),:);
%%%%%% store the new results (exclude the node at the western face of the node eastofCP)
xpt2_labelA{ii,1} = a{1};
xpt2_labelA{ii,2} = a{2};
xpt2_labelA{ii,3} = a{3};
xpt2_labelA{ii,4} = NaN;
elseif Idx1_labelA(ii,:) == 4 %# xpoint1 lies on the west face
%%%%% Find the node at the western end of the face which contains xpoint1
node_Anext(ii,:) = nodecount(ii,:) - 1;
%%%%%% extract n, s, e, w faces from AllNormalvectors
a = Allvectors(node_Anext(ii,:),:);
%%%%%% store the new results (exclude the node at the eastern face of the node westofCP)
xpt2_labelA{ii,1} = a{1};
xpt2_labelA{ii,2} = a{2};
xpt2_labelA{ii,3} = NaN;
xpt2_labelA{ii,4} = a{4};
end
end
展望未来,我想要的是在每个cpNodes周围指定一个邻域(例如:参见图中的红色虚线),然后查找该邻域内的所有x点以及整理它们。
从图中可以看出:%there are 3 x-points for Vector A (pixels 1|2), hence,
ya1 = 0, ya2 = 0, ya3 = -1
xa1 = +1, xa2 = +1, xa3 = 0
%also, there are 4 x-points for Vector B (pixels 3|2)
yb1 = +1, yb2 = +1, yb3 = 0, yb4 = 0
xb1 = 0, xb2 = 0, xb3 = +1, xb4 = +1
%average vector A:
Va = [(ya1 + ya2 + ya3)/3, (xa1 + xa2 + xa3)/3];
%ans:
Va = [-1/3, 2/3]
%average vector B:
Vb = [(yb1 + yb2 + yb3 + yb4)/4, (xb1 + xb2 + xb3 + xb4)/4];
%ans:
Vb = [0.5, 0.5]
%angle between A and B:
angle = 180 - ( acos( dot(Va, Vb) / (norm(Va) * norm(Vb) ) ) * 180/pi )
%ans:
angle = 108.4349
老实说,我不知道如何解决这个问题 - 这就是我在这里需要帮助的原因。 非常感谢您对此的预期帮助/建议/意见。