我要删除黑色蒙版和人体图像之间的白色边框
图像输入示例:
图像输出的厚度为1:
图像输出的厚度为2:
我尝试了一些在这里找到的具有模糊和阈值的游戏 我还使用此代码查找并绘制了轮廓
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()
但是我发现的轮廓是黑色蒙版边缘而不是白线 我玩过厚度游戏,效果很好,但是在每幅图像上,轮廓都是不同的,整个图中的厚度也不相等
删除它的最佳方法是什么?
答案 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_RECT
或cv2.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)
结果
您可以试验内核形状和迭代次数。要删除更多的噪声,请增加内核大小和迭代次数,而要删除更少的噪声,请减少内核大小和迭代次数。
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)
帮助上面的答案,我可以再次绘制轮廓并协调地创建新蒙版,但是我敢肯定,这样做有更好的优雅方法
为澄清起见,我想改进遮罩,以防止在新背景上出现白色边框时出现