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
相关产品推荐
相关产品推荐

