我有一个人的二进制图像。在MATLAB中,还定义了边界点和图像的中心,它们是两个列矩阵。现在我想从中心到边界点绘制线条,这样我就可以获得这些线条与图像边界之间的所有交点。我怎样才能做到这一点?这是我到目前为止的代码: 如果有人可以提供帮助,那么编写的代码只是为了得到一个交叉点
clear all
close all
clc
BW = im2bw(imread('C:\fyc-90_1-100.png'));
BW = imfill(BW,'holes');
[Bw m n]=preprocess(BW);
[bord sk pr_sk]=border_skeleton(BW);
boundry=bord;
L = bwlabel(BW);
s = regionprops(L, 'centroid');
centroids = cat(1, s.Centroid);
答案 0 :(得分:2)
您需要做的第一件事就是弄清楚如何绘制线条。为了简化这一点,我们假设人体的中心存储为cen = [x1 y1]
的数组,正如您所说的那样。现在,假设您点击图片中的任意位置,就会得到另一个点linePt = [x2 y2]
。让我们假设x
和y
坐标分别是水平和垂直分量。我们可以找到该线的斜率和截距,然后在这两个点之间创建由斜率和截距参数化的点,以生成您的线点。我要指出的一件事是,如果我们绘制一条带有垂直线的斜坡,根据定义,斜率将是无穷大。因此,我们需要检查是否有这种情况。如果我们这样做,我们假设所有x
点都相同,而y
则不同。一旦获得斜率和截距,只需在线之间创建点。你不得不自己选择你想要多少点,因为我不知道你的图像的分辨率,也不知道你想要的线多大。然后,我们将其存储到名为linePoints
的变量中,其中第一列包含x
值,第二列包含y
值。换句话说:
换句话说,这样做:
%// Define number of points
numPoints = 1000;
%// Recall the equation of the line: y = mx + b, m = (y2-y1)/(x2-x1)
if abs(cen(1) - linePt(1)) < 0.00001 %// If x points are close
yPts = linspace(cen(2), linePt(2), numPoints); %// y points are the ones that vary
xPts = cen(1)*ones(numPoints, 1); %//Make x points the same to make vertical line
else %// Normal case
slp = (cen(2) - linePt(2)) / cen(1) - linePt(1)); %// Solve for slope (m)
icept = cen(2) - slp*cen(1); %// Solve for intercept (b)
xPts = linspace(cen(1), linePt(1), numPoints); %// Vary the x points
yPts = slp*xPts + icept; %// Solve for the y points
end
linePoints = [xPts(:) yPts(:)]; %// Create point matrix
假设您有一个点数组[x y]
,其中x
表示水平坐标,y
表示您的直线坐标。我们可以简单地找到您边界中所有这些点与线上所有点之间的距离。如果任何点在某个阈值之下(例如0.0001
),那么这表示交叉点。请注意,由于浮点数据的关键,我们无法检查距离是否为0
,因为数据中每个离散点之间的步长。
我还假设border_skeleton
返回相同格式的点。此方法可以在不指定质心的情况下工作。因此,我不需要在我提出的方法中使用质心。此外,我将假设您的线点存储在一个名为linePoints
的矩阵中,该矩阵与我刚才谈到的类型相同。
换句话说,这样做:
numBoundaryPoints = size(boundry, 1); %// boundary is misspelled in your code BTW
ptsIntersect = []; %// Store points of intersection here
for idx = 1 : numBoundaryPoints %// For each boundary point...
%//Obtain the i'th boundary point
pt = boundry(:,idx);
%//Get distances - This computes the Euclidean distance
%//between the i'th boundary point and all points along your line
dists = sqrt(sum(bsxfun(@minus, linePoints, pt).^2, 2));
%//Figure out which points intersect and store
ptsIntersect = [ptsIntersect; linePoints(dists < 0.0001, :)];
end
最后,ptsIntersect
将存储与此线相交的边界上的所有点。请注意,我在这里做了很多假设,因为你没有(或者似乎不愿意)提供比你在评论中指定的更多细节。