检测 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 因为漫画面板相当外部)。
漫画通常是灰度的,但有时不是,所以我正在转换为灰度并在轮廓检测之前使用二进制阈值。
一些其他想法:
边缘检测是否更适合这项任务?
我还注意到我的数组在图片的边缘有边框,填充会有帮助吗?
漫画有点多变,所以暴力方法可能会更好吗?
我的预感是等高线区域会告诉您一些关于路径可能有多复杂的信息。
我会采用更简单的指标,例如等高线的高度 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, 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).
复杂对象的分割和索引
漫画书图片(与您要求的不同,但可能对后续步骤有用)
我正在尝试检测 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 因为漫画面板相当外部)。
漫画通常是灰度的,但有时不是,所以我正在转换为灰度并在轮廓检测之前使用二进制阈值。
一些其他想法:
边缘检测是否更适合这项任务?
我还注意到我的数组在图片的边缘有边框,填充会有帮助吗?
漫画有点多变,所以暴力方法可能会更好吗?
我的预感是等高线区域会告诉您一些关于路径可能有多复杂的信息。
我会采用更简单的指标,例如等高线的高度 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, 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).
复杂对象的分割和索引 漫画书图片(与您要求的不同,但可能对后续步骤有用)