如何检测区域上下的点?

Stu*_*PhD 2 matlab image image-processing image-segmentation

我有这个图像:

在此输入图像描述

红点是划分这个阿拉伯语单词段的不同字母的坐标.

我想检测点之间区域上方或下方的点.

点是(从左到右)= [81,183;80,217;83,275;83,314]

现在在[81,183]和之间的字母上方有一个点[80,217].同样有上述部分之间的点[80,217][83,275]与点下方区域[83,275][83,314].

我想要做的是假设在坐标上方检测到一个点,然后必须删除该坐标.是否有可能在Matlab中检测到这些?

编辑:这是原始图像

在此输入图像描述

第一张图片只是展示我感兴趣区域的作物

Cap*_*ode 5

您可以使用regionprops 以下示例实现提取单个对象的坐标:

im=rgb2gray(imread('http://i.stack.imgur.com/jic1X.jpg'));
P=regionprops(~im2bw(im), 'All');

Areas=cell2mat({P.Area});
Centroids=cell2mat({P.Centroid}');
Run Code Online (Sandbox Code Playgroud)

仅选择面积大于10但小于100的点:

Coord=Centroids(Areas< 100 & Areas > 10,:);
Run Code Online (Sandbox Code Playgroud)

监控发现的点:

imshow(im);
hold on
for k=1:length(Coord)
    plot(Coord(k,1), Coord(k,2), 'ro');
    hold on
end
Run Code Online (Sandbox Code Playgroud)

结果:

找到了点

然后,您可以使用以下内容对点进行排序:

Aboves=Coord(Coord(:,2) < 80,:);
Belows=Coord(Coord(:,2) > 80,:);
Run Code Online (Sandbox Code Playgroud)

从这里开始,有很多方法可以解决您的问题,其中一个选项如下:

dots=[81,183;80,217;83,275;83,314];

DetectDots=zeros(length(dots)-1, 1); % Creating a vector of zeros corresponding to the gaps between the elements in 'dots' 
for k=1:size(dots,1)-1
    if ~isempty(find((Aboves(:,1) > dots(k,2) & Aboves(:,1) < dots(k+1,2)))) %*
        DetectDots(k)=1;
    elseif ~isempty(find((Belows(:,1) > dots(k,2) & Belows(:,1) < dots(k+1,2))))
        DetectDots(k)=-1;
    else
        DetectDots(k)=0;
    end

end
Run Code Online (Sandbox Code Playgroud)

结果是在这种情况下DetectDots具有值的向量,[1,1,-1]其指示在两个第一点之间,以及在第二点和第三点之间以及在向量的第三点和最后一点之间的点之间存在点dots.

*find返回一个逻辑数组,其中包含满足条件的数组.isempty检查输出find是否至少有一个元素.因此,如果数组中至少有一个元素AbovesBelows符合条件,则条件为1.~是逻辑NOT,因此~=意味着不相等.&是逻辑AND.另请注意,图像和数组之间的坐标在matlab中是反转的.