Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 如何找到文档中最大的空白(白色)正方形区域并返回其坐标和面积?_Python_Opencv_Image Processing_Document - Fatal编程技术网

Python 如何找到文档中最大的空白(白色)正方形区域并返回其坐标和面积?

Python 如何找到文档中最大的空白(白色)正方形区域并返回其坐标和面积?,python,opencv,image-processing,document,Python,Opencv,Image Processing,Document,我需要找到文档中最大的空白区域并显示其坐标、中心点和面积,使用python将二维码放在那里。 我认为OpenCV和Numpy应该足以完成这项任务 使用哪种打谷机?因为有很多类型的扫描: 灰色,BW,带颜色,如何正确找到轮廓 如何以最快的方式实现这一点?使用 第一次从谷歌扫描是附加的,在那里你可以看到代码 应该找到最大的空方块面积。 @马克·塞切尔,谢谢!这段代码适用于所有白色背景的文档,但是当我在背景中使用带有颜色的smth时,它会发现一个完全不同的区域。另外,为了保持文档中的细线,我在阈

我需要找到文档中最大的空白区域并显示其坐标、中心点和面积,使用python将二维码放在那里。 我认为OpenCV和Numpy应该足以完成这项任务

  • 使用哪种打谷机?因为有很多类型的扫描: 灰色,BW,带颜色,如何正确找到轮廓
  • 如何以最快的方式实现这一点?使用 第一次从谷歌扫描是附加的,在那里你可以看到代码 应该找到最大的空方块面积。
@马克·塞切尔,谢谢!这段代码适用于所有白色背景的文档,但是当我在背景中使用带有颜色的smth时,它会发现一个完全不同的区域。另外,为了保持文档中的细线,我在阈值化后使用了腐蚀。试图更改阈值和腐蚀参数,但仍无法正常工作。 编辑帖子,添加彩色图片。
以下是一种可能的方法:

#!/usr/bin/env python3

import cv2
import numpy as np

def largestSquare(im): 
    # Make image square of 100x100 to simplify and speed up
    s = 100
    work = cv2.resize(im, (s,s), interpolation=cv2.INTER_NEAREST)

    # Make output accumulator - uint16 is ok because...
    # ... max value is 100x100, i.e. 10,000 which is less than 65,535
    # ... and you can make a PNG of it too
    p = np.zeros((s,s), np.uint16)
  
    # Find largest square
    for i in range(1, s): 
        for j in range(1, s): 
            if (work[i][j] > 0 ): 
                p[i][j] = min(p[i][j-1], p[i-1][j], p[i-1][j-1]) + 1
            else: 
                p[i][j] = 0

    # Save result - just for illustration purposes
    cv2.imwrite("result.png",p)

    # Work out what the actual answer is
    ind = np.unravel_index(np.argmax(p, axis=None), p.shape)
    print(f'Location: {ind}')
    print(f'Length of side: {p[ind]}')
      
# Load image and threshold
im  = cv2.imread('page.png', cv2.IMREAD_GRAYSCALE)
_, thr = cv2.threshold(im,127,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)

# Get largest white square
largestSquare(thr) 
输出

Location: (21, 77)
Length of side: 18

注意事项:

  • 我删掉了你的红色注释,所以它不会干扰我的算法

  • 我使用大津阈值来获得纯黑白-这可能适合您的用例,也可能不适合您的用例。这将取决于你的扫描和纸张背景等

  • 我将图像缩小到100x100,这样就不用花一整天的时间运行了。您需要将结果缩放回原始图像的大小,但我认为您可以很容易地做到这一点


  • 关键词:图像处理、图像、Python、OpenCV、最大的白色方块、最大的空白。

    你所在地区的奇形方块;-)@MarkSetchell这只是一个例子:)当问题模棱两可或样本图像不具有代表性时,回答问题的人可能会感到恼火,因为你浪费时间建立在错误的假设上。你的标题要求找到最大的区域(没有指定形状),你的文本要求一个正方形,你的图表显示一个矩形-至少有两个非常不同的问题/答案。谢谢你的评论,编辑了这篇文章