2016-11-29 1248 views
3

我有一个DIY家庭影楼拍照。我想他们是纯白色背景(#FFFFFF)与最低的用户交互Python OpenCV纯白色背景

这是原始图片我已经(无任何处理,只是原始JPG从相机) original image

我实现了用简单的Python程序OpenCV的和Tkinter的UI为

1)获取与对象(ROI矩形)

我决定选择与UI的投资回报率,也许以后我会写代码来自动识别照片对象。

select ROI

2)同cv2.grabCut功能我尝试从该矩形

grab cut with rect

cv2.grabCut(image, self.mask, rect, bgdmodel, fgdmodel, 5, cv2.GC_INIT_WITH_RECT) 

3)切背景如果必要的I为grabcut创建定制掩模可以提供更精确的对象提取

grab cut with mask

cv2.grabCut(image, self.mask, rect, bgdmodel, fgdmodel, 5, cv2.GC_INIT_WITH_MASK) 

4)这个步骤i可以创建掩模在我的对象位于后。我还通过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]] 

调整掩模,该掩模具有多个宽度和高度

object mask

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) 

而得到这样的结果: output

看起来不错,除了物体右侧的一些工件。这好像是我的面具不适合。这不是一个真正的问题。真正的问题是:seamlessClone给我的不是真正的白色背景。看看等级:

levels

一些奇怪的梯度和背景是不是真的白色的右下角。我尝试了很多图像,并且经常有这样的事情。

我的问题是:什么是正确的方法来做我想要的?我的方法是否可以用于此任务以及如何在没有这种渐变的情况下制作真正的白色(#FFFFFF)背景。谢谢

+1

拍照时可能会使用更多的灯。 – furas

回答

1

如果你在分割你的面具前你bump up the contrast你可能能够摆脱阴影没有额外的灯光或手动初始化。

对于这样一个干净的背景,你可以尝试其他分割,如Watershed。它也使用标记,但速度稍快。

您可以从一个阈值+ dilation得到distance transforms +门槛内的标记,外标记,如果你想他们,你可以从边缘线,Hough Transformsactive contours

我认为你的seamlessClone正在引起渐变。 '无缝'部分是由于混合。只需将黑色蒙版乘以图像以去除背景,然后将结果添加到白色图像即可。

+0

好的,我会看看分水岭,谢谢。 – striker

1

不知道你是否愿意考虑另一种工具,但如果你在Linux上,ImageMagick可能已安装,并且能够很容易地做到这一点,无需任何编码。它也可用于OS X和Windows。

所以,如果我们开始与此图像:

enter image description here

,让我们假设为红线坐标对应到这是550px宽480像素高,从顶偏移250,200的图像图片左侧。然后,只需在终端命令行,你可以运行:

convert photo.jpg -crop 550x480+250+200 \ 
    -fuzz 25% -fill white -draw 'color 0,0 floodfill' -trim result.jpg 

给你这个:

enter image description here

这个命令行指... “打开photo.jpg和作物出红色部分,允许左上角的像素颜色变化25%,并用纯白色填充图像。将其修整。另存为result.jpg

您可以设置模糊较高的边缘比例较高。

+0

ImageMagick添加奇怪的边缘 – striker