Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检测XKCD漫画面板的角点_Python_Opencv_Image Processing_Corner Detection - Fatal编程技术网

Python 检测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:

我正在尝试检测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.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