我有这张图片:
红点是划分该阿拉伯语单词段不同字母的坐标。
我想检测点之间区域上方或下方的点。
点(从左到右)= [81,183;80,217;83,275;83,314]
现在[81,183]
和[80,217]
之间的字母上方有一个点。同样,[80,217]
和[83,275]
之间的部分以及地区[83,275]
和[83,314]
之下的点也有。
我想要做的是假设在坐标上方检测到一个点,那么必须删除该坐标。 是否有可能在Matlab中检测到这些?
编辑:这是原始图片
第一张图片只是展示我感兴趣区域的作物
答案 0 :(得分: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}');
仅选择面积大于10但小于100的点:
Coord=Centroids(Areas< 100 & Areas > 10,:);
监控发现的点:
imshow(im);
hold on
for k=1:length(Coord)
plot(Coord(k,1), Coord(k,2), 'ro');
hold on
end
结果:
然后,您可以使用以下内容对点进行排序:
Aboves=Coord(Coord(:,2) < 80,:);
Belows=Coord(Coord(:,2) > 80,:);
从这里开始,有很多方法可以解决您的问题,其中一个选项如下:
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
结果是一个矢量DetectDots
,在这种情况下值[1,1,-1]
表示在两个第一点之间,第二点和第三点之间以及第三点之间的点之间有点。向量dots
的最后一点。
* find
返回一个逻辑数组,其中包含符合条件的数组。 isempty
检查find
的输出是否至少包含一个元素。因此,如果数组Aboves
或Belows
中至少有一个元素符合条件,则条件为1。 ~
是逻辑NOT,因此~=
表示不相等。 &
是逻辑AND。另请注意,图像和数组之间的坐标在matlab中反转。