如何使用cv2分割图像?



>我有图像绘画.bmp。我想把它分成 32x32 块。这是我的代码:

import cv2
image = cv2.imread('paint.bmp')
img_h, img_w = image.shape[:2]
bl_w, bl_h = 32, 32
for i in range(int(img_h/bl_h)):
for j in range(int(img_w/bl_w)):
cropped = image[i*bl_h:bl_h, j*bl_w:bl_w]
cv2.imwrite("Cropped image{}{}.bmp".format(str(i+1), str(j+1)), cropped)

第一个块正在保存,但在它之后程序崩溃并显示:
cv2.error: OpenCV(4.2.0) C:projectsopencv-pythonopencvmodulesimgcodecssrcloadsave.cpp:715: error (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'

问题出在第cropped = image[i*bl_h:bl_h, j*bl_w:bl_w]

在第一个块中,你像这样切片:image[0:32, 0:32],这是工作正常的。但是,在第二个块中,您正在尝试获取image[32:32, 32:32],它将始终返回 en 空数组。

有一种更简单的方法可以做到这一点:

import cv2
image = cv2.imread('image.bmp')
img_h, img_w = image.shape[:2]
bl_w, bl_h = 32, 32
for i in range(int(img_h/bl_h)):
for j in range(int(img_w/bl_w)):
cropped = image[i*bl_h:(i+1)* bl_h, j*bl_w:(j+1)*bl_w]
cv2.imwrite("Cropped image{}{}.bmp".format(str(i+1), str(j+1)), cropped)

https://pypi.org/project/empatches/

效果很好,如果您想重叠补丁以及稍后重新组合补丁,它允许您设置步幅

from empatches import EMPatches
from cv2 import imread
original_image= imread("blah.png")
emp = EMPatches()
patchsize = 32
stride = 32
# to split
patches, indices = emp.extract_patches(
original_image, patchsize=patchsize, stride=stride
)
# process patches. In my case I extract a mask using unet (ML)    
new_patches = map(some_fn, patches)
# to recombine
recombined = emp.merge_patches(new_patches , indices , 'overwrite')

没有测试上面的代码,但这种方法总是对我有用

最新更新