Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.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_Machine Learning_Image Processing_Computer Vision - Fatal编程技术网

Python 如何从图像中提取子图像?

Python 如何从图像中提取子图像?,python,opencv,machine-learning,image-processing,computer-vision,Python,Opencv,Machine Learning,Image Processing,Computer Vision,在给定主映像的情况下,计算和提取所有子映像的方法是什么 样本1 输入: 输出应该是8个子图 样本2 输入: 输出应有6个子图 注:这些图像样本取自互联网。图像可以是随机尺寸 有没有办法在这些图像中画出分隔线,然后根据这些细节进行分割 e、 g: 我认为,从任意图形表中正确提取所有单个图形(如两个示例所示)不会有一个通用的解决方案——至少使用某种“简单”的图像处理技术 对于具有恒定网格布局和单个图形之间恒定颜色空间的“完美”表格(如两个示例所示),可以采用以下方法: 计算x和y方向的平均标准偏

在给定主映像的情况下,计算和提取所有子映像的方法是什么

样本1 输入:

输出应该是8个子图

样本2 输入:

输出应有6个子图

注:这些图像样本取自互联网。图像可以是随机尺寸

有没有办法在这些图像中画出分隔线,然后根据这些细节进行分割

e、 g:


我认为,从任意图形表中正确提取所有单个图形(如两个示例所示)不会有一个通用的解决方案——至少使用某种“简单”的图像处理技术

对于具有恒定网格布局和单个图形之间恒定颜色空间的“完美”表格(如两个示例所示),可以采用以下方法:

  • 计算
    x
    y
    方向的平均标准偏差,并使用一些自定义参数计算阈值。恒定颜色空间内的平均标准偏差应接近零。这里需要一个自定义参数,因为会有一些伪影,例如来自JPG压缩的伪影,其影响可能或多或少严重
  • 使用自定义参数对平均标准偏差进行二进制关闭。参考第二个示例,标题或类似内容周围可能有小的恒定颜色空间。同样,这里也需要自定义参数
  • 从得到的二进制“信号”,我们可以提取每个子图像的开始和停止位置,从而通过从原始图像切片来提取子图像本身。注意:只有当表格显示恒定的网格布局时,这才有效 这将是所述方法的一些代码:

    导入cv2
    将numpy作为np导入
    从skimage.morphology导入二进制函数
    def从_表中提取_(图像、标准_thr、内核_x、内核_y):
    #x和y方向上的平均标准偏差阈值
    标准x=np.平均值(np.标准(图像,轴=1,轴=1)>标准thr
    标准y=np.平均值(np.标准(图像,轴=0,轴=1)>标准thr
    #二进制关闭以关闭小空格,例如标题周围
    std_xx=二进制_关闭(std_x,np.ones(内核_x))
    std_yy=二进制(std_y,np.one(kernel_y))
    #查找每个子映像的开始和停止位置
    start_y=np.where(np.diff(np.int8(std_xx))==1)[0]
    停止y=np.where(np.diff(np.int8(std_xx))=-1)[0]
    start_x=np.where(np.diff(np.int8(std_yy))==1)[0]
    停止x=np.where(np.diff(np.int8(std_yy))==-1[0]
    #提取子图像
    返回[图像[y1:y2,x1:x2,:]
    对于拉链中的y1、y2(开始、停止)
    对于zip中的x1、x2(开始、停止)]
    对于(['image1.jpg','image2.png'])中的文件:
    img=cv2.imread(文件)
    cv2.imshow(“图像”,img)
    子图像=从_表中提取_(img,5,21,11)
    打印(“{}找到子图像”。。格式(len(子图像)))
    对于子图像中的i:
    cv2.imshow(“子图像”,i)
    cv2.等待键(0)
    
    打印
    输出为:

    找到8个子图像。 找到6个子图像。 此外,显示每个子图像也是为了可视化

    对于这两幅图像,相同的参数是合适的,但这只是一些巧合

    ----------------------------------------
    系统信息
    ----------------------------------------
    平台:Windows-10-10.0.16299-SP0
    Python:3.9.1
    NumPy:1.20.1
    OpenCV:4.5.1
    scikit图像:0.18.1
    ----------------------------------------
    
    我只能使用简单的阵列切片技术提取子图像。我不确定这是否是你要找的。但是如果你知道表的列和行,我想你可以提取子图像

    image = cv2.imread('table.jpg')
    p = 2 #number of rows
    q = 4 #number of columns
    
    width, height, channels = image.shape
    
    width_patch = width//p
    height_patch = height//q
    x=0
    for i in range(0, width - width_patch, width_patch):
        for j in range(0, height - height_patch, height_patch):
            crop = image[i:i+width_patch, j:j+height_patch]
            cv2.imwrite("image_{0}.jpg".format(x),crop)
            x+=1
            # cv2.imshow('crop', crop)
            # cv2.waitKey(0)```