是否可以在图像中绘制多个轮廓

时间:2016-03-31 04:19:55

标签: image matlab matlab-figure contour

我有一个有三个班级的图像。每个班级都标有数字{2,3,4},背景为{1}。我想在图像中绘制每个类的轮廓。我尝试了下面的MATLAB代码,但轮廓看起来重叠在一起(蓝色和绿色,黄色和绿色)。我怎样才能在每个班级画一个轮廓?

Img=ones(128,128);
Img(20:end-20,20:end-20)=2;
Img(30:end-30,30:end-30)=3;
Img(50:end-50,50:end-50)=4;
%%Img(60:end-60,60:end-60)=3; %% Add one more rectangular
imagesc(Img);colormap(gray);hold on; axis off;axis equal;
[c2,h2] = contour(Img==2,[0 1],'g','LineWidth',2);
[c3,h3] = contour(Img==3,[0 1],'b','LineWidth',2);
[c4,h4] = contour(Img==4,[0 1],'y','LineWidth',2);
hold off;

enter image description here

这是我的预期结果

enter image description here

1 个答案:

答案 0 :(得分:2)

这种情况正在发生,因为每个"类"在其形状方面被定义为空心方形。因此,当您使用contour时,它会跟踪广场的所有边界。例如,当你在图上绘制这个时,只需要一个类。具体来说,看一下使用Img == 2创建的第一个二进制图像。我们得到这个图片:

enter image description here

因此,如果您在此形状上调用contour,则实际上是在跟踪此对象的边界。它现在更有意义吗?如果您为其余的类重复此操作,这就是轮廓线颜色重叠的原因。中空正方形的最内部与另一个正方形的最外部重叠。现在,当您第一次实际获得此信息时,请致电contour

enter image description here

正如你所看到的," 2级"实际上被定义为挖空的灰色方块。如果你想达到你想要的,一种方法是填写每个空心方块然后将contour应用于此结果。假设您有图像处理工具箱,请在每一步使用带有'holes'选项的imfill

Img=ones(128,128);
Img(20:end-20,20:end-20)=2;
Img(50:end-50,50:end-50)=3;
Img(30:end-30,30:end-30)=3;
Img(35:end-35,35:end-35)=3;
Img(50:end-50,50:end-50)=4;
imagesc(Img);colormap(gray);hold on; axis off;axis equal;

%// New
%// Create binary mask with class 2 and fill in the holes
im = Img == 2;
im = imfill(im, 'holes');
%// Now draw contour
[c2,h2] = contour(im,[0 1],'g','LineWidth',2);

%// Repeat for the rest of the classes
im = Img == 3;
im = imfill(im, 'holes');

[c3,h3] = contour(im,[0 1],'b','LineWidth',2);
im = Img == 4;
im = imfill(im, 'holes');

[c4,h4] = contour(im,[0 1],'y','LineWidth',2);
hold off;

我们现在得到这个:

enter image description here