如何使用python删除图像中人物周围的白色边框/边缘?

时间:2019-11-11 11:23:25

标签: python image opencv image-processing computer-vision

我要删除黑色蒙版和人体图像之间的白色边框

图像输入示例:

enter image description here

图像输出的厚度为1:

enter image description here

图像输出的厚度为2:

enter image description here

我尝试了一些在这里找到的具有模糊和阈值的游戏 我还使用此代码查找并绘制了轮廓

    thickness = 3
    image = cv2.imread('../finetune/22.png')
    blank_mask = np.zeros(image.shape, dtype=np.uint8)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    cnts = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]

    cv2.drawContours(image, cnts, -1, (255,0,0), thickness)
    cv2.imshow('image', image)
    cv2.imwrite('../finetune/22-'+str(thickness)+'r.png',image)
    cv2.waitKey()

但是我发现的轮廓是黑色蒙版边缘而不是白线 我玩过厚度游戏,效果很好,但是在每幅图像上,轮廓都是不同的,整个图中的厚度也不相等

删除它的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

这里有两种方法:

方法1: cv2.erode()

您可以使用侵蚀来侵蚀白色前景对象的边界。本质上,该想法是使用内核执行2D卷积。可以使用cv2.getStructuingElement()创建内核,您可以在其中传递要创建的所需内核的形状和大小。典型的内核是exampleFunc := ` package main func B(ch chan int) { for x := range ch { } } ` fset := token.NewFileSet() file, err := parser.ParseFile(fset, "-", exampleFunc, parser.ParseComments) ast.Inspect(file, func(node ast.Node) bool { fn, ok := node.(*ast.UnaryExpr) // try to cast if !ok { return true } ast.Print(fset, fn) return true }) cv2.MORPH_RECTcv2.MORPH_ELLIPSE。如果内核下的所有像素均为cv2.MORPH_CROSS,则内核会在图像中滑动,其中一个像素被视为1,否则它会侵蚀到1。最终结果是,将根据内核的形状和大小丢弃边界上的所有像素。前景的厚度会减小,可用于消除小的白噪声或分离物体。您可以根据要执行的迭代次数来调整侵蚀的强度。

0

方法1:使用cv2.morphologyEx()打开

与侵蚀相反的是扩张可以增强图像。通常,在腐蚀后执行拨号以“标准化”形态操作的效果。 OpenCV将这些步骤组合成一个称为形态学打开的操作。开口只是腐蚀然后扩张的别称,与仅腐蚀相比,开放通常会给您带来更平滑的结果。

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
erode = cv2.erode(image, kernel, iterations=1)

结果

enter image description here

您可以试验内核形状和迭代次数。要删除更多的噪声,请增加内核大小和迭代次数,而要删除更少的噪声,请减少内核大小和迭代次数。

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

答案 1 :(得分:0)

nathancy 发送的以下答案完全显示了我想要获得的结果,但并不能帮助我解决根本问题

当我使用drawContours时,我可以在蒙版上绘制轮廓并对其进行改进

所以这是有关我的问题的更多信息:

使用图像分割方法蒙版后,我想更改背景(在示例中,我使用黑色背景),但是在新背景和图形之间仍然有白色轮廓

原始图片:

https://drive.google.com/open?id=1P39VCEe2FTqkD6JbdM4ueMr_71C6nI42

面具:

https://drive.google.com/open?id=1LTHaclsDOxRJCI9t5bLg3PeanseRR9bc

输出:

https://drive.google.com/open?id=1-uQx77-fmMf_9qFSgNMBvo77Q6Ag8qEZ

这是我使用的代码:

    image = cv2.imread('../finetune/1.png')
    mask = cv2.imread('../finetune/1mask.png')

    output = np.zeros(image.shape, dtype=np.uint8)

    output[np.where(mask == 255)] = image[np.where(mask == 255)]

    cv2.imshow("output",output)
    cv2.imwrite('../finetune/1.output.png',output)

帮助上面的答案,我可以再次绘制轮廓并协调地创建新蒙版,但是我敢肯定,这样做有更好的优雅方法

为澄清起见,我想改进遮罩,以防止在新背景上出现白色边框时出现