Это происходит потому, что каждый «класс» определяется как полый квадрат с точки зрения его формы. Поэтому, когда вы используете contour
, он отслеживает все границы квадрата. Возьмем, к примеру, только один класс, когда вы построите это на рисунке. В частности, взгляните на свое первое двоичное изображение, которое вы создаете с помощью Img == 2
. Мы получаем это изображение:
Поэтому, если вы назвали contour
на эту форму, вы на самом деле трассировать границы этого объекта. Теперь это имеет больше смысла, не так ли? Если вы повторите это для остальных классов, это является причиной того, что контурные линии перекрываются по цвету. Самая внутренняя часть полого квадрата перекрывается с самой внешней частью другого квадрата. Теперь, когда вы звоните contour
первый раз, когда вы на самом деле получите это:
Как вы можете видеть, «класс 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;
Теперь мы получаем это:
Многие благодарственное raryeng. – user8264
@ user8264 Тебе очень рады. – rayryeng
@ user8264 - этот ответ достаточно для принятия? – rayryeng