im using the following code to split the image into 20 equal parts of grid
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)
However i have two issues,
How can I be able to sort this out?
There is a bit of confusion which I guess is caused by how numpy
handles image dimensions and coordinates using the (row, column)
convention and how OpenCV handles them using (x, y)
convention.
The shape
member of numpy
array contains image height at first index and width at second index.
A usual convention used for the naming convention is that M
is the number of rows or height of the image while N
is the number of columns or width of the image.
Another problem is that not all the sub-images are being saved because names are assigned using y
variable only which eventually overwrites the existing images due to repetition of y
. Unique names are required for saving all the sub-images. One possible way is to use both x
and y
to generate a unique name.
Following is a working code with all of the above-mentioned issues fixed.
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)