将图像拆分为多个网格

时间:2018-03-21 03:58:31

标签: python opencv cv2

使用以下代码将图像分割为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. 它仅在图像的一半上绘制网格而不是完全。
  3. 我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:3)

我猜有些混淆是numpy如何使用(row, column)约定处理图像维度和坐标以及OpenCV如何使用(x, y)约定来处理它们。

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

用于命名约定的通常惯例是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)