【问题标题】:automatically extract tiles from comics自动从漫画中提取图块
【发布时间】:2020-12-25 16:28:56
【问题描述】:

是否可以使用 ImageMagick 等现有工具自动从漫画中提取图块,还是我应该自己编写工具?

我使用 ImageMagick (Using imagemagick how can i slice up an image into several separate images?, https://superuser.com/questions/1308928/how-to-automatically-crop-and-cut-an-image-into-several-images-using-imagemagick/1308953#1308953) 看到了答案,但在我的情况下,瓷砖可以有不同的大小(高度可以改变)。

彼此下方总是有 1 个图块(只有 1 列),并且每个图块被相同颜色的一些空间分隔(可以在图像中使用黑色、灰色或白色的水平颜色渐变来分隔图块)所以应该可以通过查看具有相同像素颜色的水平线来检测何时有新的图块并提取它们。

理想情况下,如果漫画有 2 列或更多列具有不同高度的图块,也应该可以提取图块(这可能有点复杂,因为不一定有具有相同像素颜色的完整水平线)。

更新:您可以根据要求在下面找到我制作的快速示例。有些漫画有一些字符和文本气泡从图块中流出,这使得无法比较水平线上的像素,所以我故意在示例中添加了这个。我还添加了另一列和具有不同宽度或高度的图块,以便获得一个示例,其中包含漫画中可以找到的内容的摘要。

【问题讨论】:

  • 如果你能发布一个示例图像会很棒。
  • @kavko 你可以在webtoons.com找到几个样本
  • 投掷带有 DIY 说明的网页链接是不礼貌的。不算,实际上链接没有帮助。
  • @YvesDaoust 抱歉,如果这看起来很粗鲁,那不是故意的。我添加了一个链接,因为我不拥有该内容,所以我认为我不允许直接上传样本。我认为这不值得一票否决。
  • 在我看来,kavko 的请求仍未得到解决。

标签: image-processing imagemagick image-manipulation image-recognition imagemagick-convert


【解决方案1】:

这里是如何在 ImageMagick 中做到这一点。但我注意到您的图纸可能不具有代表性。首先,我期待的是垂直堆叠的帧,而不是随机排列。其次,部分图形在 X 或 Y 上重叠,因此边界框会重叠。我使用连接组件来提取边界框。然后我只需遍历边界框并裁剪图像。

输入:

Unix 语法:

bboxArr=(`convert -quiet boxes.png +repage -threshold 50% \
-morphology open square:3 -type bilevel \
-define connected-components:exclude-header=true \
-define connected-components:verbose=true \
-define connected-components:area-threshold=1500 \
-define connected-components:mean-color=true \
-connected-components 4 null: | grep "gray(0)" | awk '{print $2}'`)
num=${#bboxArr[*]}
for ((i=0; i<num; i++)); do
bbox="${bboxArr[$i]}"
echo "$bbox;"
convert -quiet boxes.png +repage -crop "$bbox" +repage boxes_$i.png
done

这是一个更好的例子:

bboxArr=(`convert -quiet DoomPatrol1.jpg +repage -negate -threshold 25% -type bilevel \
-define connected-components:exclude-header=true \
-define connected-components:verbose=true \
-define connected-components:area-threshold=20000 \
-define connected-components:mean-color=true \
-connected-components 8 null: | grep "gray(255)" | awk '{print $2}'`)
num=${#bboxArr}
for ((i=0; i<num; i++)); do
bbox="${bboxArr[$i]}"
echo "$bbox;"
convert -quiet DoomPatrol1.jpg +repage -crop "$bbox" +repage boxes_$i.png
done

【讨论】:

  • 谢谢。当我们用盒子编号(从左到右,然后从上到下)保存文件名时,是否可以按照它们出现的顺序对盒子进行排序?你知道为什么你制作的 2 个脚本不适用于像 webtoons.com/en/comedy/toaster-dude/ep-1/… 这样的其他漫画吗?要下载示例,您可以使用 Node.js 和 GeckoDriver 使用此 Selenium WebDriver 脚本截屏:pastebin.com/DX9w8PSu
  • 我在尝试使用上面提到的 webtoons.com 示例时收到错误 convert: ../../magick/resource.c:1098: RelinquishMagickResource: Assertion `resource_info.memory &gt;= 0' failed.,但即使我使用 GIMP 将图像剪切为更小的高度,框也无法正确提取。
  • 您的 ImageMagick 版本和平台是什么?在我看来,该消息表明您的内存不足。检查您的资源 (convert -list resource)。如有必要,如果您不在共享服务器上,请修改您的 ImageMagick policy.xml 文件。
  • 我的一个命令中有一个错字。 num=${#bboxArr} 应该是 num=${#bboxArr[*]}。我在上面的帖子中编辑了我的代码。现在看看这是否有效。
  • 我正在使用最新的 Ubuntu 20.04 软件包中的 ImageMagick 6.9.10-23 Q16 x86_64 20190101。在/etc/ImageMagick-6/policy.xml 中将内存从 256MiB 更改为 512MiB 修复了该错误。使用您的新命令,仍未从我共享的 Toaster Dude 链接中提取所有图块,例如第一个图块和教室中的图块。有时会提取太多图像,例如文本气泡“嗯……”以及女孩说“你好,伙计。”。
猜你喜欢
  • 2021-02-06
  • 1970-01-01
  • 2011-12-31
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多