裁剪 numpy.ndArray 报错 - ValueError: 不能将空图像保存为 JPEG
我正在尝试把一个numpy数组的图像裁剪成更小的块,并保存它们。但是当我试图保存这些小块时,出现了一个错误,提示图像是空的。
我的脚本考虑到了那些没有达到块大小的多余像素,并把它们分散到边缘。
print("Slicing Image.")
path = 'Sliced/'
filename= 'sample_svs_2_'
img = tif.imread('sample_svs_2.svs')
print(type(img))
print(img.shape)
#This works, proving that
#this method of saving is valid
data = im.fromarray(img)
data.save('Sliced/sample.jpg')
#depth, height, width = img.shape
height, width, depth = img.shape
tilesize = 256
print("Height: ", height)
print("Width: ", width)
print("Depth: ", depth)
leftExcessPixels = int((width%tilesize)/2)
topExcessPixels = int((height%tilesize)/2)
XNumberOfTiles = int(width/tilesize)
YNumberOfTiles = int(height/tilesize)
print('Left Excess Pixels: ' + str(leftExcessPixels) )
print('Top Excess Pixels: ' + str(topExcessPixels) )
print('Number of X tiles: ' + str(XNumberOfTiles))
print('Number of Y tiles: ' + str(YNumberOfTiles))
for y in range(YNumberOfTiles):
for x in range(XNumberOfTiles):
XStart = (leftExcessPixels + (tilesize * x))
YStart = (topExcessPixels + (tilesize * y))
XEnd = XStart + tilesize
YEnd = YStart + tilesize
croppedImage = img[XStart:YStart, XEnd:YEnd]
data = im.fromarray(croppedImage)
data.save('Sliced/sample_x' + str(x) + '_y' + str(y) + '.jpg')
终端输出:
Slicing Image.
<class 'numpy.ndarray'>
(13271, 19992, 3)
Height: 13271
Width: 19992
Depth: 3
Left Excess Pixels: 12
Top Excess Pixels: 107
Number of X tiles: 78
Number of Y tiles: 51
Traceback (most recent call last):
File "c:\fileImageSlicer.py", line 72, in <module>
sliceImage()
File "c:\fileImageSlicer.py", line 52, in sliceImage
data.save('Sliced/sample_x' + str(x) + '_y' + str(y) + '.jpg')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\miniconda3\Lib\site-packages\PIL\Image.py", line 2439, in save
save_handler(self, fp, filename)
File "C:\miniconda3\Lib\site-packages\PIL\JpegImagePlugin.py", line 647, in _save
raise ValueError(msg)
ValueError: cannot write empty image as JPEG
我可能哪里做错了呢?有一点我完全忽视了,就是读取的图像有一个z维度(深度?)。我不太明白为什么图像会有深度(可能是为了颜色?RGB),而我也不太确定该怎么使用它……
1 个回答
1
错误出现在这一行:
croppedImage = img[XStart:YStart, XEnd:YEnd]
正确的数组切片方法应该是:
croppedImage = img[YStart:YEnd, XStart:XEnd]
这样每个裁剪后的图片的形状都是 (256, 256, 3)