2011-04-07 23 views
-1

我有一个包含硬币图像的图像。硬币的形状可以是长方形,正方形,圆形,椭圆形等。我想在硬币上绘制一个矩形,并从背景中分割硬币。我不能给出矩形的x或y值,因为硬币可能在图像中的任何位置。有谁知道如何做到这一点?使用Matlab在对象上绘制矩形

+1

它是一个二进制图像?即硬币在其他地方和零的地方?还是可以转换成一个? – abcd 2011-04-07 13:50:06

+0

@R。 M.原始的一个是彩色图像,我也有该图像的二进制版本。 – 2011-04-07 14:55:03

+0

当你说你想在硬币上画一个矩形时,这是否意味着你希望选择一个包含硬币的小区域,然后在这个较小的图像上进行分割? – Ghaul 2011-04-07 17:05:52

回答

0

首先阅读MathWorks advice on pattern recognition。具体如何解决问题取决于很多事情,例如

  • 除了硬币,图像还有什么?

  • 所有的硬币是相同的颜色还是不同的颜色?

  • 你是否有一组图像与确定的硬币位置?

1

我在下面的答案假设你已经确定了硬币,并且你有一个清理过的图像(二进制将是很好的),你可以使用。

coin=load('penny.mat'); %#load matlab's stock image 
img=zeros(256,256); 
img(65:192,65:192)=coin.P;%# this is an approximation to the sort of image that I think you have 

enter image description here

现在我们需要才能知道边界矩形的大小图像的范围。由于在其他地方存在图像和零点的情况下,数组不为零,因此以下给出了边的长度。

sideX=sum(sum(img,1)>0); 
sideY=sum(sum(img,2)>0); 

使用kmeans找到图像的质心。

[indX,indY]=ind2sub(size(img),find(img(:)>0)); 
[~,centroid]=kmeans([indX,indY],1); 

现在最后覆盖在图像顶部的矩形。

imagesc(img);colormap(gray);hold on 
rectangle('Position',([centroid,sideX,sideY]-[sideX,sideY,0,0]/2),'EdgeColor','w');hold off 

结果:

enter image description here

如果你有一个嘈杂的图像(即,它不是均匀零图像之外,那么你就必须设定一个阈值,以找到边框)