确定没有循环的矩阵边界

时间:2016-05-03 09:17:01

标签: matlab matrix

我有一个2D矩阵。矩阵中存在一些区域,其中元素是非零的,特别是在边缘周围的任何区域,它们都是零。

我使用图像作为颜色图绘制矩阵,并希望将矩阵中显示非零值之间边界的曲线添加到零值。有没有循环的任何巧妙的方法吗?

2 个答案:

答案 0 :(得分:6)

这看起来像是convhull的工作:

为了说明这段代码,我将举一个虚拟的例子:

A=zeros(10);
B=binornd(1,0.5,8,8);
A(2:end-1,2:end-1)=B

A =

 0     0     0     0     0     0     0     0     0     0
 0     0     0     1     0     0     0     0     0     0
 0     0     1     1     1     1     1     1     0     0
 0     0     1     1     0     0     0     0     1     0
 0     0     0     1     0     0     0     1     0     0
 0     1     0     0     0     0     0     1     0     0
 0     0     0     1     1     1     1     1     1     0
 0     0     1     0     1     1     1     1     0     0
 0     1     0     1     1     1     1     0     1     0
 0     0     0     0     0     0     0     0     0     0

1 /查找所有非零条目的位置:

[row,col]=find(A);

2 /采取这些位置的凸包

k=convhull(row,col);

3 /绘制凸包(我绘制非零点,但在你的问题中它将是你的图像点)

plot(row(k),col(k),'r-',row,col,'b*')

结果:

enter image description here

答案 1 :(得分:2)

另一个选择是使用图像处理工具箱和bwperim功能。如果您知道您的区域完全关闭(即边界没有洞),这将有效。

这是一个使用黑白图像的示例,您有两个选项:填充内部空白之前或之后。您可以在结果中看到差异。

A = imread('circles.png');

Afill=imfill(A,'holes'); % optional
Abound1=bwperim(Afill);
Abound2=bwperim(A);
imshow([A,Abound, Abound2])

enter image description here

您可以使用:

在另一个上面绘制一个
[x,y]= find(Abound2);
hold on
image(A*255)  %// If A is logical, else use just A (not *255)
colormap('gray')
plot(y,x,'r.')
hold off
axis tight

enter image description here

如果您有灰度图像(或每个位置(2D矩阵)中具有单个值的矩阵,则可以先通过以下方式对其进行二值化:

  1. 如果您知道对象外的所有内容都是零 A=yourA>0;
  2. 如果您想要将对象与背景分开,并且A=im2bw(yourA,level)背景不完全为零,选择您自己的关卡,或让Otsu为您level=graythresh(yourA)