You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TIF图像做腐蚀操作时报'TiffImageFile' object is not subscriptable如何解决

报错成因

你调用Image.open()返回的是PIL的TiffImageFile图像对象,不属于数组类型,不支持[x1:x2, y1:y2]这种切片下标操作,所以会抛出该类型错误。另外原代码还存在依赖库未导入、维度顺序不匹配的隐藏问题。

修复方案
  • 先补充导入缺失的依赖库:numpy、cv2、matplotlib.pyplot
  • 将读取到的PIL图像对象转换为numpy数组,才能进行切片和数值运算
  • 调整尺寸取值的顺序:PIL图像的size属性返回顺序是(宽度, 高度),转成numpy数组后shape属性返回顺序是(高度, 宽度),需要对应调整避免维度不匹配,额外增加灰度转换逻辑避免多通道图像运算异常
修复后完整代码
from PIL import Image
import requests
from io import BytesIO
import numpy as np
import cv2
from matplotlib import pyplot as plt

url = 'https://people.math.sc.edu/Burkardt/data/tif/venus2.tif'
response = requests.get(url)
# 转为numpy灰度数组
img = np.array(Image.open(BytesIO(response.content)).convert('L'))

k=3
SE= np.ones((k,k), dtype=np.uint8)
constant= (k-1)//2

# 取numpy数组的高和宽
m,n = img.shape[0], img.shape[1]
imgErode= np.zeros((m,n), dtype=np.uint8)

# 手动实现腐蚀操作
for i in range(constant, m-constant):
    for j in range(constant,n-constant):
        temp= img[i-constant:i+constant+1, j-constant:j+constant+1]
        product= temp*SE
        imgErode[i,j]= np.min(product)

plt.imshow(imgErode,cmap="gray")
plt.show()
cv2.imwrite("Eroded3.png", imgErode)

内容的提问来源于stack exchange,提问作者rnv86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:06:04