如何在Matlab中为二值图像绘制外轮廓

时间:2016-04-06 01:11:24

标签: matlab image-processing matlab-figure contour

我的图像有3个类,标记为{2,3,4},作为第一行的左图。

对于每个类,我想绘制一个轮廓,该轮廓是该类的外轮廓,作为第二行中的图像。我尝试使用下面的Matlab代码,但它显示了重叠轮廓。我怎样才能达到预期的效果? 谢谢大家

Img=ones(128,128);
Img(20:end-20,20:end-20)=2;
Img(30:end-30,30:end-30)=3;
Img(45:end-45,45:end-45)=4;
Img(50:end-65,68:end-48)=2; %% Add one more rectangular
Img(68:end-48,50:end-65)=3; %% Add one more rectangular

subplot(121);imagesc(Img);colormap(gray);hold on; axis off;axis equal;
subplot(122);imagesc(Img);colormap(gray);hold on; axis off;axis equal;
[c2,h2] = contour(Img==2,[0 1],'r','LineWidth',2);
[c3,h3] = contour(Img==3,[0 1],'g','LineWidth',2);
[c4,h4] = contour(Img==4,[0 1],'b','LineWidth',2);
hold off;  

enter image description here

2 个答案:

答案 0 :(得分:0)

要获得预期结果,您必须使用bwlabel标记已连接的组件。然后,对于每个组件,我们将使用imfill到组件中的fill个洞来绘制单个轮廓。这种方式将保证您将为每个组件绘制外轮廓。用于绘制类的所有可能组件。这是代码

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('location2')
bucket_files = [x.key for x in bucket.objects.all()]

输出:

enter image description here

答案 1 :(得分:-2)

好吧,更多的是一个想法而不是答案。

我认为您可以更改边界的颜色,而不是使用contour

figure
Img=ones(128,128);

 %the boundaries of two boxes
Img(20:end-20, 20)=2;
Img(20:end-20, end-20)=2;
Img(20, 20:end-20)=2;
Img(end-20, 20:end-20)=2;

Img(30:end-30, 30)=3;
Img(30:end-30, end-30)=3;
Img(30, 30:end-30)=3;
Img(end-30, 30:end-30)=3;


imagesc(Img);
cm = colormap(gray);

%modify the colormap for the different boundaries
colordata = cm;
colordata(findnearest([1:length(colordata)]/length(colordata), 2/max(max(Img))),:) = [1 0 0];
cm = colormap(colordata);

colordata = cm;
colordata(findnearest([1:length(colordata)]/length(colordata), 3/max(max(Img))),:) = [0 1 0];
colormap(colordata)

enter image description here

如果您理解为什么红色不在颜色条中的2处,那么您就完成了。我无法弄明白。希望这有所帮助..

N.B。我使用findneareest来查找我想要修改的colomap条目。