【问题标题】:separate the background and foreground [closed]分离背景和前景[关闭]
【发布时间】:2015-12-03 15:41:21
【问题描述】:

我有这样的图像: python中分离背景和前景的最佳方法是什么?

【问题讨论】:

  • 看看GrabCut
  • @Shai 有不需要用户交互的工具吗?
  • 用户提供的矩形不一定要严格和准确。如果在您的情况下足够安全地说对象不在框架的边界内,那么您可以将其用作GrabCut 的输入进行分割。
  • 如果您不想要用户交互,您需要了解您要查找的内容。计算机视觉算法很难盲目地从图像中提取您要查找的内容。您显示的图像非常棘手,因为人眼可以跟随鱼在水中的任何内容,但计算机算法将难以将其与水区分开来。换句话说,简短的回答是“不”,没有用户交互是不行的,长的回答通常是“是”,但您需要大量了解自己在做什么。
  • 那么你应该澄清你的问题。将前景与背景分开通常称为“背景减法”,并且与“图像分割”有几个链接,这很难,提取对象周围的边界框称为“对象检测”(或“对象跟踪”,如果它在时间序列中)并且明显更容易。一切都取决于您想要的“提取”的准确性,如果您想要一个粗略的估计,这将是可行的,如果您想要一个准确的提取,那就更难了。

标签: python image-processing scikit-learn image-segmentation


【解决方案1】:

如果您想要估计您的对象在哪里,您可以使用图像的颜色 来获得一个想法。以下所有步骤均使用scikit-image 完成。这些操作非常基本,是 Lab 色彩空间中的简单阈值处理(最基本的图像处理工具)。如果您想要在没有用户交互的情况下进行更复杂的操作,则需要付出更多的努力。

0) 导入包

import numpy as np
from skimage import io, color

1) 加载图片

rgb = io.imread('your_image_path')

2) 将图像转换为Lab colorspace。 Lab 颜色空间通常为大多数应用提供更好的颜色分离性。

img = color.rgb2lab(rgb)

3) 阈值 Lab 颜色空间

thresholded = np.logical_and(*[img[..., i] > t for i, t in enumerate([40, 0, 0])])

上面的行基本上对图像进行了阈值化,并将第一个通道 (L) 中为 >40 的所有像素设置为 1,而在第一个通道中为 >0第二和第三通道(a, b),将打破任何这些条件的像素设置为0

4) 显示结果:

from matplotlib import pyplot as plt
fig, ax = plt.subplots(ncols=2)
ax[0].imshow(rgb);         ax[0].axis('off')
ax[1].imshow(thresholded); ax[1].axis('off')
plt.show()

如上所述,这是一个非常快速(不太好)的结果,但应该足以让您获得一个边界框。然后,您可以从thresholded 图像中提取ymin, ymax, xmin, xmax,您将获得对象的边界框。

【讨论】:

  • 超级答案。谢谢。我有一个问题,为什么是40?有什么好的规则来定义这个数字吗?
  • 它是经过反复试验选择的。该数字是特定于图像的。其背后的原因是 Lab 中 L 通道的缩放。在这种特殊情况下,阈值 > 40 会抑制所有不亮的像素(L 是亮度)。
猜你喜欢
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多