答案 0 :(得分:1)
我假设图像已经注释。在这种情况下,我们只需找到标记的点并提取坐标(如果您需要通过代码动态找到红点,这根本不会起作用)
您要做的第一件事是找到一个用于细分的好功能。有关代码和详细信息,请参阅我的答案what-should-i-use-hsv-hsb-or-rgb-and-why。这会产生以下图像:
我们可以看到饱和度(以及其他一些)是很好的候选颜色空间。所以现在你必须将图像转移到新的颜色空间并进行阈值处理以找到你的点。
使用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
答案 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
的第一个参数是轴对象,而不是图形对象。