python - 检测图像中的漫画对话气泡区域

标签 python numpy scipy computer-vision scikit-image

我有一个漫画页面的灰度图像,其中有几个对话气泡(=语音气球等),这些气泡是带有白色背景和纯黑色边框的封闭区域,其中包含内部文本,即类似的东西:

Sample comic strip image

我想检测这些区域并创建一个掩码(二进制也可以),它将覆盖对话气泡的所有内部区域,即类似于:

Sample resulting mask image

相同的图像,蒙版覆盖,完全清晰:

Sample image with transparent mask overlay

所以,我对算法的基本想法是这样的:

  1. 检测文本的位置——在每个气泡中放置至少一个像素。稍微扩大这些区域并应用阈值以获得更好的起点;我已经完成了这部分:

Text positions outlined

  1. 使用填充或某种图形遍历,从第 1 步中检测为气泡内像素的每个白色像素开始,但处理初始图像,填充白色像素(应该在气泡内气泡)并停在暗像素(应该是边框或文本)上。

  2. 使用某种 binary_closing删除气泡内的暗区(即对应于文本的区域)的操作)。这部分工作正常。

到目前为止,第 1 步和第 3 步有效,但我正在为第 2 步而苦苦挣扎。我目前正在使用 scikit-image ,而且我没有看到任何现成的算法,如 flood fill 在那里实现。显然,我可以使用像广度优先遍历这样的微不足道的东西,基本上是 as suggested here ,但在 Python 中完成时它真的很慢。我怀疑像 binary_erosion 这样复杂的形态学东西或 generate_binary_structure在 ndimage 或 scikit-image 中,但我很难理解所有形态学术语以及基本上我如何使用它实现这样的自定义洪水填充(即从第 1 步图像开始,处理原始图像并生成输出以分离输出图像)。

我愿意接受任何建议,包括 OpenCV 等中的建议。

最佳答案

即使您的实际问题与处理管道的第 2 步有关,我还是想建议另一种方法,恕我直言,这种方法可能更简单,而且正如您所说,您愿意接受建议。

  1. 使用原始步骤 1 中的图像,您可以创建气泡中没有文本的图像。

    已实现

  2. 检测去除文本的原始图像的边缘。这应该适用于对话气泡,因为气泡边缘非常明显。

    边缘检测

  3. 最后使用边缘图像和最初检测到的“文本位置”来找到边缘图像中包含文本的区域。

    Watershed-Segmentation

对于这个非常笼统的回答,我很抱歉,但现在对我来说实际编码已经太晚了,但如果问题仍然悬而未决,并且您需要/想要更多关于我的建议的提示,我会更详细地阐述它。但你绝对可以看看 Region based segmentation在 scikit-image 文档中。

关于python - 检测图像中的漫画对话气泡区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34356635/

相关文章:

python - 如何将复杂的嵌套字典排序为嵌套列表

python - 单括号和双括号 Numpy 数组有什么区别?

python - 对 `copy` 的 `numpy.astype` 属性感到困惑

python - 如何在Python中计算矩生成函数的导数?

python - 在数据框列上使用 cleanco

python - 从图像 PIL 获取图像文件名

Python - Unicode 到 ASCII 的转换

python-2.7 - numpy recarray append_fields : can't append numpy array of datetimes

python:在顶部绘制带有函数线的直方图

python - 稀疏特征值 : scipy. sparse.linalg.eigs 比 scipy.linalg.eigvals 慢