Python 检测XKCD漫画面板的角点
我正在尝试检测xkcd漫画的面板,以便将它们剪掉。我想检索实现的随机XKCD漫画,并可靠地知道面板的角在哪里。我的理想输出如下: 其中我有一些或所有的角落面板。 我有一个包含整个漫画的数组,到目前为止,我的方法是找到大轮廓,如下所示:Python 检测XKCD漫画面板的角点,python,opencv,image-processing,corner-detection,Python,Opencv,Image Processing,Corner Detection,我正在尝试检测xkcd漫画的面板,以便将它们剪掉。我想检索实现的随机XKCD漫画,并可靠地知道面板的角在哪里。我的理想输出如下: 其中我有一些或所有的角落面板。 我有一个包含整个漫画的数组,到目前为止,我的方法是找到大轮廓,如下所示: contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) conts=[] if len(contours) > 1:
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.APROXPOLYDP检测角点。然而,我的轮廓似乎还不够,因为我通常不会得到好的角,而且当我画轮廓时,它们看起来也不太好
良好的运行:
有些点落在角落里
糟糕的一个:
那个女孩身上布满了圆点
我想知道我的轮廓是否做错了什么,比如可能没有选择正确的模式,我选择了外部的RETR_,因为漫画面板是相当外部的
漫画通常是灰度的,但有时不是,所以我将转换为灰度,并在轮廓检测之前使用二进制阈值
其他一些想法:
边缘检测是否更适合此任务
我还注意到我的数组在图片的边缘有边框,所以填充会有帮助吗
漫画有点变化无常,所以暴力手段会更好吗
我的直觉是轮廓区域会告诉你路径有多复杂。 我会使用一个更简单的度量,比如轮廓的高度: 注意3轮廓边界框高度突出:
[127, 16, 16, 16, 16, 35, 15, 36, 16, 16, 16, 18, 17, 17, 220, 220, 220]
您可能希望选择性地将条件更改为阈值,而不是精确值。
e、 g
上面的完整代码生成:
请注意,我使用的是放大边缘。
它适用于具有这些迭代的图像,因为过滤器扩展框的轮廓足够大,但不会太多,以至于它们与文本/字符合并。
这可能是其他图像需要调整的地方
更新通过快速搜索,我发现了一些潜在的有趣资源:
Kumiko,漫画切割器是一套工具,用于计算有关漫画书页面、面板等的有用信息。它的主要优点是找出漫画页面图像文件中面板的位置。Kumiko还可以编译漫画书中所有页面的面板信息,并将其作为一个JSON格式的数据对象呈现。
与您所问的不同,无论对下一步有多大潜在用处,我的直觉是轮廓区域将告诉您路径有多复杂。 我会使用一个更简单的度量,比如轮廓的高度: 注意3轮廓边界框高度突出:
[127, 16, 16, 16, 16, 35, 15, 36, 16, 16, 16, 18, 17, 17, 220, 220, 220]
您可能希望选择性地将条件更改为阈值,而不是精确值。
e、 g
上面的完整代码生成:
请注意,我使用的是放大边缘。
它适用于具有这些迭代的图像,因为过滤器扩展框的轮廓足够大,但不会太多,以至于它们与文本/字符合并。
这可能是其他图像需要调整的地方
更新通过快速搜索,我发现了一些潜在的有趣资源:
Kumiko,漫画切割器是一套工具,用于计算有关漫画书页面、面板等的有用信息。它的主要优点是找出漫画页面图像文件中面板的位置。Kumiko还可以编译漫画书中所有页面的面板信息,并将其作为一个JSON格式的数据对象呈现。
与您所问的不同,尽管hough变换对下一步可能有用,但它可能会有所帮助,尽管我不确定它对线条图的效果如何:请您明确一下,您的漫画是否有窗口装饰,例如最大化、最小化按钮和框架,好吗?谢谢。请出示您的密码。轮廓应位于白色区域,而不是黑色区域。所以,如果你想在帧的黑色矩形上获得轮廓,你需要反转图像。@MarkSetchell,不,这些只是OpenCV输出。我将研究hough和Inversion hough变换可能会有所帮助,尽管我不确定它在线条图中的表现:请问,您能否清楚您的漫画是否有诸如最大化、最小化按钮和框架之类的窗口装饰?谢谢。请出示您的密码。轮廓应位于白色区域,而不是黑色区域。所以,如果你想在帧的黑色矩形上获得轮廓,你需要反转图像。@MarkSetchell,不,这些只是OpenCV输出。我会研究hough和Inversion哇,非常全面。谢谢你的回答,这些看起来很有希望。我最终使用了Kumiko并将他们的命令行工具调整为内联python。看:哇,非常全面。谢谢你的回答,这些看起来很有希望。我最终使用了Kumiko并将他们的命令行工具调整为内联python。见:
# if the contour bounding box height is > 3/4 of the image height
cv2.boundingRect(cnt)[3] > img.shape[0] * 0.75