在对象周围创建边界

时间:2018-01-19 06:14:52

标签: matlab image-processing

我有input image。我想创建对象周围的边界,并将边界像素标记为灰色,即128强度值。我需要this类型的输出图像。我追踪了对象的边界:

Order

但它只会在图像上绘制边界。我想围绕输入图像的对象创建这个边界。我怎样才能做到这一点?我希望我的问题很明确。

2 个答案:

答案 0 :(得分:0)

虽然我不知道你为什么要这样,但是建议:你可能不想这样做。这样做会丢失图像信息。对于您来说,了解边界索引就足够了,并且您已经知道它们。

但是,如果您真的想要这样做,这就是您需要做的事情:

clear;
clc;

im=imread('https://i.stack.imgur.com/r7uQz.jpg');
im=im(31:677,90:1118);
level = graythresh(im);
BW = im2bw(im,level);
[B,L] = bwboundaries(BW,'noholes');

for k = 1:length(B)
   boundary = B{k};

   %%%%%%%%% Fill the boundary locations with he desired value.
   for ii=1:size(boundary,1)
   im(boundary(ii,1), boundary(ii,2))=128;
   end
end

如果你想要"胖"如图像中的行,请在以下后添加:

im128=im==128;
bigboundary=imdilate(im128,ones(5));
im(bigboundary)=128;

enter image description here

答案 1 :(得分:-2)

您可以使用OpenCV对图像进行二值化并检测轮廓。 这是Python实现:

img = cv2.imread(r'D:\Image\temp1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret,bw = cv2.threshold(gray,100,255,cv2.THRESH_BINARY)
_,contours,hierarchy = cv2.findContours(bw, cv2.RETR_CCOMP, 1)
for cnt in contours:
    c = np.random.randint(0,256,3)
    c = (int(c[0]), int(c[1]), int(c[2]))
    cv2.drawContours(img,[cnt],0,c,2)

输出图片:

enter image description here