如何在MATLAB中获得直线和边界之间的交点?

如何在MATLAB中获得直线和边界之间的交点?,matlab,Matlab,我有一个人的二元图像。在MATLAB中,边界点和图像中心也被定义,它们是两列矩阵。现在我想画一条从中心到边界点的线,这样我就可以得到这些线和图像边界之间的所有交点。我该怎么做?以下是我目前掌握的代码: 如果有人能帮忙的话,这段代码就是为了得到一个交点而写的 clear all close all clc BW = im2bw(imread('C:\fyc-90_1-100.png')); BW = imfill(BW,'holes'); [Bw m n]=preprocess(BW)

我有一个人的二元图像。在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);
步骤#1-生成您的线路 你需要做的第一件事就是弄清楚如何划清界限。为了简单起见,我们假设人体的中心存储为
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
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
最后,
ptsinterspect
将存储沿边界与该线相交的所有点。请注意,我在这里做了很多假设,因为您没有(或似乎不愿意)给出比您在评论中指定的更多的细节



祝你好运。

我不确定你有什么问题。我是否了解您的情况:您有一个包含二进制项的图像
(0,1)
。其中,
1
正在构建一个身体的轮廓(在您的例子中是一个人)。现在,您需要从图像中心到每个包含
1
的箱子画一条线。是这样吗?如果是这样的话,您的问题到底是什么?您希望如何保存这些行?你需要kartesian坐标吗?。。。请尽量提供更多的细节和你迄今为止所做的尝试。顺便说一句,欢迎来到StackOverflow。此外,你能发布一个指向示例图像的链接吗?也许是一张你想做的草图?提出好问题是获得好答案的关键。请张贴图片。如果你画一条从中心点向边界辐射的线,它们在边界点上不与边界点相互作用吗?也就是说,我不明白您的输出与原始大纲有什么不同。一个草图或简单的例子(中心坐标、几个边界点的坐标、预期的输出)会有很大帮助。不要在注释中添加代码,这很难阅读。按上面的“编辑”,把你的代码放在你的问题中,用{}按钮把它标记为代码。我还不清楚你们到底想做什么,或者你们希望得到什么样的产出。谢谢。请沿着这行写下去。这条线必须从图像的中心画出来。@user3883254-我说不,让你自己来弄清楚怎么样?我想这条线路已经由你提供了。老实说,我给你的方式比那些评论你帖子的人给你的方式要多。为什么我们不把这记为一个学习练习,剩下的你自己做呢?祝你好运你怎么接电话的。请帮帮我。线必须从center@user3883254-编辑。我提出了一种从中心画线的方法,但你必须选择线的终点在哪里。这就是我所能做到的(说实话,这是你应得的)。祝你好运。@user3883254-。。。。那么这个练习的全部意义是什么呢?如果最后一个点在边界上,那么交点不应该是边界吗?如果要从中心到边界画无限多条线,最终的结果不是边界本身吗?这就像在第一张照片就足够的情况下尝试拍摄一张照片。现在我真的不知道你在说什么。