我有一个2D矩阵。矩阵中存在一些区域,其中元素是非零的,特别是在边缘周围的任何区域,它们都是零。
我使用图像作为颜色图绘制矩阵,并希望将矩阵中显示非零值之间边界的曲线添加到零值。有没有循环的任何巧妙的方法吗?
答案 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*')
结果:
答案 1 :(得分:2)
另一个选择是使用图像处理工具箱和bwperim
功能。如果您知道您的区域完全关闭(即边界没有洞),这将有效。
这是一个使用黑白图像的示例,您有两个选项:填充内部空白之前或之后。您可以在结果中看到差异。
A = imread('circles.png');
Afill=imfill(A,'holes'); % optional
Abound1=bwperim(Afill);
Abound2=bwperim(A);
imshow([A,Abound, Abound2])
您可以使用:
在另一个上面绘制一个[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
如果您有灰度图像(或每个位置(2D矩阵)中具有单个值的矩阵,则可以先通过以下方式对其进行二值化:
A=yourA>0;
A=im2bw(yourA,level)
背景不完全为零,选择您自己的关卡,或让Otsu为您level=graythresh(yourA)