def get_patches(filepath,patch_size,crop_sizes,save_dir=None):
'''This functions creates and return patches of given image with a specified patch_size, if save_dir is given patches are saved to the directory'''
image = cv2.imread(filepath)
filename=filepath.split('/')[-1].split('.')[0]
height, width , channels= image.shape
patches = []
for crop_size in crop_sizes: #We will crop the image to different sizes
crop_h, crop_w = int(height*crop_size),int(width*crop_size)
image_scaled = cv2.resize(image, (crop_w,crop_h), interpolation=cv2.INTER_CUBIC)
for i in range(0, crop_h-patch_size+1, patch_size):
for j in range(0, crop_w-patch_size+1, patch_size):
x = image_scaled[i:i+patch_size, j:j+patch_size] # This gets the patch from the original image with size patch_size x patch_size
if save_dir!=None: #If save_dir is specified we will save the patches to the given directory
if not os.path.exists(save_dir):
os.mkdir(save_dir)
pactch_filepath=save_dir+'/'+filename+''+str(crop_h)+''+str(i)+'_'+str(j)+'.jpg'# Creating a distinct patch filename
cv2.imwrite(pactch_filepath,x) # Saving the image to the path
patches.append(x)
return patches
ZGVmIGdldF9wYXRjaGVzKGZpbGVwYXRoLHBhdGNoX3NpemUsY3JvcF9zaXplcyxzYXZlX2Rpcj1Ob25lKToKICAgICcnJ1RoaXMgZnVuY3Rpb25zIGNyZWF0ZXMgYW5kIHJldHVybiBwYXRjaGVzIG9mIGdpdmVuIGltYWdlIHdpdGggYSBzcGVjaWZpZWQgcGF0Y2hfc2l6ZSwgaWYgc2F2ZV9kaXIgaXMgZ2l2ZW4gcGF0Y2hlcyBhcmUgc2F2ZWQgdG8gdGhlIGRpcmVjdG9yeScnJwogICAgaW1hZ2UgPSBjdjIuaW1yZWFkKGZpbGVwYXRoKSAKICAgIGZpbGVuYW1lPWZpbGVwYXRoLnNwbGl0KCcvJylbLTFdLnNwbGl0KCcuJylbMF0KICAgIGhlaWdodCwgd2lkdGggLCBjaGFubmVscz0gaW1hZ2Uuc2hhcGUKICAgIHBhdGNoZXMgPSBbXQogICAgZm9yIGNyb3Bfc2l6ZSBpbiBjcm9wX3NpemVzOiAjV2Ugd2lsbCBjcm9wIHRoZSBpbWFnZSB0byBkaWZmZXJlbnQgc2l6ZXMKICAgICAgICBjcm9wX2gsIGNyb3BfdyA9IGludChoZWlnaHQqY3JvcF9zaXplKSxpbnQod2lkdGgqY3JvcF9zaXplKQogICAgICAgIGltYWdlX3NjYWxlZCA9IGN2Mi5yZXNpemUoaW1hZ2UsIChjcm9wX3csY3JvcF9oKSwgaW50ZXJwb2xhdGlvbj1jdjIuSU5URVJfQ1VCSUMpCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgY3JvcF9oLXBhdGNoX3NpemUrMSwgcGF0Y2hfc2l6ZSk6CiAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDAsIGNyb3Bfdy1wYXRjaF9zaXplKzEsIHBhdGNoX3NpemUpOgogICAgICAgICAgICAgIHggPSBpbWFnZV9zY2FsZWRbaTppK3BhdGNoX3NpemUsIGo6aitwYXRjaF9zaXplXSAjIFRoaXMgZ2V0cyB0aGUgcGF0Y2ggZnJvbSB0aGUgb3JpZ2luYWwgaW1hZ2Ugd2l0aCBzaXplIHBhdGNoX3NpemUgeCBwYXRjaF9zaXplCgogICAgICAgICAgICAgIGlmIHNhdmVfZGlyIT1Ob25lOiAgI0lmIHNhdmVfZGlyIGlzIHNwZWNpZmllZCB3ZSB3aWxsIHNhdmUgdGhlIHBhdGNoZXMgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNhdmVfZGlyKToKICAgICAgICAgICAgICAgICAgb3MubWtkaXIoc2F2ZV9kaXIpCiAgICAgICAgICAgICAgICBwYWN0Y2hfZmlsZXBhdGg9c2F2ZV9kaXIrJy8nK2ZpbGVuYW1lKycnK3N0cihjcm9wX2gpKycnK3N0cihpKSsnXycrc3RyKGopKycuanBnJyMgQ3JlYXRpbmcgYSBkaXN0aW5jdCBwYXRjaCBmaWxlbmFtZQogICAgICAgICAgICAgICAgY3YyLmltd3JpdGUocGFjdGNoX2ZpbGVwYXRoLHgpICMgU2F2aW5nIHRoZSAgaW1hZ2UgdG8gdGhlIHBhdGgKCiAgICAgICAgICAgICAgcGF0Y2hlcy5hcHBlbmQoeCkKICAgIHJldHVybiBwYXRjaGVz