我正试图将一个模糊的数组图像裁剪成较小的块并保存它们:但当我试图保存块时,我得到一个错误,图像是空的.

我的脚本考虑了没有达到瓷砖大小的多余像素,并将其扩展到边框.

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维(深度?)我不知道为什么一个图像有深度(可能是 colored颜色 ?RGB),我不知道如何使用它.

推荐答案

错误在行:

croppedImage = img[XStart:YStart, XEnd:YEnd]

对数组进行切片的正确方法应该是:

croppedImage = img[YStart:YEnd, XStart:XEnd]

这样,每个裁剪的图像都具有(256, 256, 3)的形状

Python相关问答推荐

仅从风格中获取 colored颜色 循环

将numpy数组存储在原始二进制文件中

Pytest两个具有无限循环和await命令的Deliverc函数

将两只Pandas rame乘以指数

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

如何使用数组的最小条目拆分数组

删除字符串中第一次出现单词后的所有内容

组/群集按字符串中的子字符串或子字符串中的字符串轮询数据框

如何在表中添加重复的列?

如何在Python中找到线性依赖mod 2

在两极中过滤

在Python中计算连续天数

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

Django Table—如果项目是唯一的,则单行

使用SeleniumBase保存和加载Cookie时出现问题

SpaCy:Regex模式在基于规则的匹配器中不起作用

为什么我只用exec()函数运行了一次文件,而Python却运行了两次?

如何在PYTHON中向单元测试S Side_Effect发送额外参数?

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?

如何在Django查询集中生成带有值列表的带注释的字段?