我有一个有三个班级的图像。每个班级都标有数字{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;
这是我的预期结果
答案 0 :(得分:2)
这种情况正在发生,因为每个"类"在其形状方面被定义为空心方形。因此,当您使用contour
时,它会跟踪广场的所有边界。例如,当你在图上绘制这个时,只需要一个类。具体来说,看一下使用Img == 2
创建的第一个二进制图像。我们得到这个图片:
因此,如果您在此形状上调用contour
,则实际上是在跟踪此对象的边界。它现在更有意义吗?如果您为其余的类重复此操作,这就是轮廓线颜色重叠的原因。中空正方形的最内部与另一个正方形的最外部重叠。现在,当您第一次实际获得此信息时,请致电contour
:
正如你所看到的," 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;
我们现在得到这个: