找到图像中以红色标记的四个点的实时坐标

时间:2016-04-22 14:00:36

标签: matlab image-processing

确切地说,我需要下图中道路的四个终点。

enter image description here

我用find [x y]。它不能实时提供令人满意的结果。

2 个答案:

答案 0 :(得分:1)

我假设图像已经注释。在这种情况下,我们只需找到标记的点并提取坐标(如果您需要通过代码动态找到红点,这根本不会起作用)

您要做的第一件事是找到一个用于细分的好功能。有关代码和详细信息,请参阅我的答案what-should-i-use-hsv-hsb-or-rgb-and-why。这会产生以下图像:

color spaces

我们可以看到饱和度(以及其他一些)是很好的候选颜色空间。所以现在你必须将图像转移到新的颜色空间并进行阈值处理以找到你的点。

使用matlab's region properties专门查找质心获得点数。那时你已经完成了。

以下是完整的代码和结果

im = imread('http://i.stack.imgur.com/eajRb.jpg');
HUE = 1;
SATURATION = 2;
BRIGHTNESS = 3;

%see https://stackoverflow.com/questions/30022377/what-should-i-use-hsv-hsb-or-rgb-and-why/30036455#30036455
ViewColoredSpaces(im)

%convert image to hsv
him = rgb2hsv(im);

%threshold, all rows, all columns, 
my_threshold = 0.8;     %determined empirically
thresh_sat = him(:,:,SATURATION) >  my_threshold;

%remove small blobs using a 3 pixel disk
se = strel('disk',3');
cleaned_sat = imopen(thresh_sat, se);% imopen = imdilate(imerode(im,se),se)

%find the centroids of the remaining blobs
s = regionprops(cleaned_sat, 'centroid');
centroids = cat(1, s.Centroid);

%plot the results
figure();
subplot(2,2,1)  ;imshow(thresh_sat) ;title('Thresholded saturation channel')
subplot(2,2,2)  ;imshow(cleaned_sat);title('After morpphological opening')
subplot(2,2,3:4);imshow(im)         ;title('Annotated img')

hold on
for (curr_centroid = 1:1:size(centroids,1))
    %prints coordinate
    x = round(centroids(curr_centroid,1));
    y = round(centroids(curr_centroid,2));
    text(x,y,sprintf('[%d,%d]',x,y),'Color','y');
end
%plots centroids
scatter(centroids(:,1),centroids(:,2),[],'y')
hold off

%prints out centroids
centroids

centroids =

7.4593 143.0000
  383.0000 87.9911
  435.3106 355.9255
  494.6491 91.1491

color spaces color spaces color spaces

答案 1 :(得分:-2)

一些示例代码可以更轻松地为您的问题定制特定的解决方案。

这个一般问题的一个解决方案是使用impoint

这样的东西
h = figure();
ax = gca; 

% ... drawing your image

points = {};
points = [points; impoint(ax,initialX,initialY)];

% ... generate more points

indx = 1 % or whatever point you care about
[currentX,currentY] = getPosition(points{indx});

应该这样做。

编辑:impoint的第一个参数是轴对象,而不是图形对象。