2016-03-31 6 views
0

У меня есть изображение, которое имеет три класса. Каждый класс помечен цифрой {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

ответ

2

Это происходит потому, что каждый «класс» определяется как полый квадрат с точки зрения его формы. Поэтому, когда вы используете contour, он отслеживает все границы квадрата. Возьмем, к примеру, только один класс, когда вы построите это на рисунке. В частности, взгляните на свое первое двоичное изображение, которое вы создаете с помощью Img == 2. Мы получаем это изображение:

enter image description here

Поэтому, если вы назвали contour на эту форму, вы на самом деле трассировать границы этого объекта. Теперь это имеет больше смысла, не так ли? Если вы повторите это для остальных классов, это является причиной того, что контурные линии перекрываются по цвету. Самая внутренняя часть полого квадрата перекрывается с самой внешней частью другого квадрата. Теперь, когда вы звоните contour первый раз, когда вы на самом деле получите это:

enter image description here

Как вы можете видеть, «класс 2» на самом деле определяется как выдолбленные серый квадрат. Если вы хотите достичь желаемого, один из способов: заполните каждый полый квадрат, затем примените contour к этому результату. Предполагая, что у вас есть набор инструментов для обработки изображений, используйте imfill с опцией 'holes' на каждом шагу:

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

+1

Многие благодарственное raryeng. – user8264

+0

@ user8264 Тебе очень рады. – rayryeng

+0

@ user8264 - этот ответ достаточно для принятия? – rayryeng

Смежные вопросы