检测 XKCD 漫画面板的角

Detect corners of XKCD comic panels

我正在尝试检测 xkcd 漫画的面板,以便将它们剪掉。我想检索随机的 XKCD 漫画(已实现)并可靠地知道面板的角在哪里。我理想的输出是这样的:

我有面板的部分或全部角。 我有一个包含整个漫画的数组,到目前为止我的方法是找到大轮廓,如下所示:

    contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
    conts=[]
    if len(contours) > 1:
        conts = sorted(contours, key=cv2.contourArea, reverse=True)[0]

然后使用cv2.approxPolyDP检测角点。不过貌似我的轮廓画的不够好,平时画的角不太好,画轮廓的时候好像不太好。

不错运行:

(一些点落在角落里)

一个不好的:

(女孩浑身是点)

我想知道我的轮廓是否有问题,比如可能没有选择正确的模式(我选择 RETR_EXTERNAL 因为漫画面板相当外部)。

漫画通常是灰度的,但有时不是,所以我正在转换为灰度并在轮廓检测之前使用二进制阈值。

一些其他想法:

  1. 边缘检测是否更适合这项任务?

  2. 我还注意到我的数组在图片的边缘有边框,填充会有帮助吗?

  3. 漫画有点多变,所以暴力方法可能会更好吗?

我的预感是等高线区域会告诉您一些关于路径可能有多复杂的信息。 我会采用更简单的指标,例如等高线的高度 boundingRect():

#!/usr/bin/env python
import cv2
import numpy as np

filename = 'boyfriend.png'
img = cv2.imread(filename)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret, dst = cv2.threshold(gray, 127 ,255,0)
# erode and negate to amplify edges
dst = cv2.erode(dst,None,iterations=2)
dst = (255-dst)

cv2.imshow('thresh', dst)

contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

if len(contours) > 1:
    # print bounding box height per contour for debugging purposes
    print([cv2.boundingRect(cnt)[3] for cnt in contours])
    # filter contours where the bounding box height matches the image height
    conts = [cnt for cnt in contours if cv2.boundingRect(cnt)[3] == img.shape[0]]
    # preview
    img = cv2.drawContours(img, conts, -1, (0,255,0), 3)

cv2.imshow('img',img)
cv2.waitKey(0)

注意3轮廓边界框高度突出:

[127, 16, 16, 16, 16, 35, 15, 36, 16, 16, 16, 18, 17, 17, 220, 220, 220]

您可能希望有选择地将条件更改为阈值而不是精确值。 例如

# if the contour bounding box height is > 3/4 of the image height
cv2.boundingRect(cnt)[3] > img.shape[0] * 0.75

上面的完整代码产生:

请注意,我正在使用 morphological filter 来放大边缘。 它适用于具有这些迭代的图像,因为过滤器足够扩展框轮廓但不会扩展到与文本/字符合并的程度。 这可能需要针对其他图像进行调整。

更新 通过快速搜索,我发现了一些可能很有趣的资源:

Kumiko

Kumiko, the Comics Cutter is a set of tools to compute useful information about comic book pages, panels, and more. Its main strength is to find out the locations of panels within a comic's page (image file). Kumiko can also compile information about panels for all pages in a comic book, and present it as one piece of data (JSON-formatted object).

复杂对象的分割和索引 漫画书图片(与您要求的不同,但可能对后续步骤有用)