【问题标题】:Split image into multiple grids将图像分割成多个网格
【发布时间】:2018-08-30 01:51:47
【问题描述】:

我使用以下代码将图像分成 20 等份的网格

import cv2

im =  cv2.imread("apple.jpg")
im = cv2.resize(im,(1000,500))
imgwidth=im.shape[0]
imgheight=im.shape[1]


y1 = 0
M = imgwidth//20
N = imgheight//20

for x in range(0,imgwidth,M):
    for y in range(0, imgheight, N):
        x1 = x + M
        y1 = y + N
        tiles = im[x:x+M,y:y+N]

        print(y1)
        cv2.rectangle(im, (x, y), (x1, y1), (0, 255, 0))
        cv2.imwrite("save/" + str(y)+".png",tiles)

cv2.imwrite("asas.png",im)

但是我有两个问题,

  1. 保存的图片大小不统一
  2. 它只在图像的一半而不是全部上绘制网格。

我怎样才能解决这个问题?

【问题讨论】:

    标签: python opencv cv2


    【解决方案1】:

    我猜这是由于numpy 如何使用(row, column) 约定处理图像尺寸和坐标以及OpenCV 如何使用(x, y) 约定处理它们造成的。

    numpy 数组的 shape 成员包含第一个索引处的图像高度和第二个索引处的宽度。

    命名约定的常用约定是M 是图像的行数或高度,而N 是图像的列数或宽度。

    另一个问题是并非所有子图像都被保存,因为名称仅使用y 变量分配,最终由于y 的重复而覆盖现有图像。保存所有子图像需要唯一的名称。一种可能的方法是同时使用xy 来生成唯一名称。

    以下是已修复所有上述问题的工作代码。

    import cv2
    
    im =  cv2.imread("apple.jpg")
    im = cv2.resize(im,(1000,500))
    
    imgheight=im.shape[0]
    imgwidth=im.shape[1]
    
    y1 = 0
    M = imgheight//20
    N = imgwidth//20
    
    for y in range(0,imgheight,M):
        for x in range(0, imgwidth, N):
            y1 = y + M
            x1 = x + N
            tiles = im[y:y+M,x:x+N]
    
            cv2.rectangle(im, (x, y), (x1, y1), (0, 255, 0))
            cv2.imwrite("save/" + str(x) + '_' + str(y)+".png",tiles)
    
    cv2.imwrite("asas.png",im)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 2016-05-31
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      相关资源
      最近更新 更多