我有一个DIY家庭影楼拍照。我希望他们在纯白色背景(#FFFFFF)上进行最少的用户交互
我使用opencv实现简单的python程序,使用Tkinter实现UI
1)获取带对象的直觉(ROI)
我决定用UI选择ROI,也许稍后我会编写代码来自动识别照片上的对象。
2)使用cv2.grabCut函数我尝试从此矩形中剪切背景
cv2.grabCut(image, self.mask, rect, bgdmodel, fgdmodel, 5, cv2.GC_INIT_WITH_RECT)
3)如有必要,我为抓取创建自定义遮罩,可以提供更精确的对象提取
cv2.grabCut(image, self.mask, rect, bgdmodel, fgdmodel, 5, cv2.GC_INIT_WITH_MASK)
4)在此步骤之后,我可以创建我的对象所在的蒙版。我还将面具调整为30px
mask = cv2.resize(mask, ( crop_img.shape[1] + 30, crop_img.shape[0] + 30))
mask = mask[30 : crop_img.shape[0], 30 : crop_img.shape[1]]
所以这个面具有更多的宽度和高度
5)我将这个面具用于seamlessClone方法
src_bg = 255 * np.ones(self.src.shape, self.src.dtype)
width, height, channels = src_bg.shape
center = (int(height / 2), int((width / 2)))
output = cv2.seamlessClone(crop_img, src_bg, mask, center, cv2.MIXED_CLONE)
除了对象右侧的一些工件外,看起来很好。好像我的面具不合适。这不是一个真正的问题。真正的问题是:seamlessClone给我的不是真正的白色背景。看看关卡:
一些奇怪的渐变和背景在右下角并不是真正的白色。我尝试了许多图像,并且经常会有这样的事情。
我的问题是:做我想做的事的正确方法是什么?我的方法是否可用于此任务以及如何在没有此类渐变的情况下制作真正白色(#FFFFFF)的背景。感谢
答案 0 :(得分:1)
如果您在分割遮罩之前bump up the contrast,则可以在没有额外光线或手动初始化的情况下摆脱阴影。
对于这样干净的背景,您可以尝试其他细分,例如Watershed。它也使用标记,但速度要快一些。
您可以从distance transforms +阈值获取内部标记,从阈值+ dilation获取外部标记,如果需要,可以使用Hough Transforms或{{从边缘获取线条3}}
我认为你的seamlessClone
导致了渐变。 '无缝'部分是由于混合。只需将黑色蒙版与图像相乘即可删除背景,然后将结果添加到白色图像中。
答案 1 :(得分:1)
不确定您是否愿意考虑其他工具,但如果您使用的是Linux,则可能会安装 ImageMagick ,并且无需任何编码即可轻松完成此操作。它也适用于OS X和Windows。
所以,如果我们从这张图片开始:
让我们假设红线的坐标对应的图像宽550像素×高480像素,偏离图片左上角250,200。然后,只需在终端的命令行中运行:
convert photo.jpg -crop 550x480+250+200 \
-fuzz 25% -fill white -draw 'color 0,0 floodfill' -trim result.jpg
给你这个:
该命令行意味着... “打开photo.jpg
并裁剪出红色部分。允许左上角像素的颜色变化25%,并将图像泛光填充为纯净修剪它。保存为result.jpg
“
您可以将模糊百分比设置得更高,以获得更难的边缘。