将图像分割成多个网格
Split image into multiple grids
我使用以下代码将图像分成 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)
但是我有两个问题,
- 保存的图片大小不一致
- 它只在图像的一半而不是整个上绘制网格。
我怎样才能解决这个问题?
有一点混乱,我猜是由于 numpy
如何使用 (row, column)
约定处理图像尺寸和坐标以及 OpenCV 如何使用 (x, y)
约定处理它们。
numpy
数组的 shape
成员包含第一个索引处的图像高度和第二个索引处的宽度。
通常用于命名约定的约定是 M
是图像的行数或高度,而 N
是图像的列数或宽度。
另一个问题是并非所有 sub-images 都被保存,因为名称仅使用 y
变量分配,最终由于 y
的重复而覆盖现有图像。保存所有 sub-images 需要唯一名称。一种可能的方法是同时使用 x
和 y
来生成唯一的名称。
以下是修复了所有 above-mentioned 问题的工作代码。
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)
我使用以下代码将图像分成 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)
但是我有两个问题,
- 保存的图片大小不一致
- 它只在图像的一半而不是整个上绘制网格。
我怎样才能解决这个问题?
有一点混乱,我猜是由于 numpy
如何使用 (row, column)
约定处理图像尺寸和坐标以及 OpenCV 如何使用 (x, y)
约定处理它们。
numpy
数组的 shape
成员包含第一个索引处的图像高度和第二个索引处的宽度。
通常用于命名约定的约定是 M
是图像的行数或高度,而 N
是图像的列数或宽度。
另一个问题是并非所有 sub-images 都被保存,因为名称仅使用 y
变量分配,最终由于 y
的重复而覆盖现有图像。保存所有 sub-images 需要唯一名称。一种可能的方法是同时使用 x
和 y
来生成唯一的名称。
以下是修复了所有 above-mentioned 问题的工作代码。
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)