我正在运行一个python演示,它旨在打开一个图像并可视化对象的分段。该脚本有一个名为loadImage()
的例程,用于加载图像:
def loadImage(self, im_id):
"""
Load images with image objects.
:param im: a image object in input json file
:return:
"""
im = self.images[im_id]
return mpimg.imread(open('%s/%s/%s'%(self.image_folder, im['file_path'], im['file_name']), 'r'))
请注意,mpimg
代表matplotlib
(因为脚本开头的行import matplotlib.image as mpimg
)。
但是,一旦脚本执行此函数,我将返回以下错误:
File "script.py", line 148, in callerFunction
im = self.loadImage(im_id)
File "script.py", line 176, in loadImage
return mpimg.imread(open('%s/%s/%s'%(self.image_folder, im['file_path'], im['file_name']), 'r'))
File "/usr/lib/pymodules/python2.7/matplotlib/image.py", line 1192, in imread
return handler(fname)
RuntimeError: _image_module::readpng: file not recognized as a PNG file
我已经完成了一些research,由于某些原因,当使用打开的文件句柄时,似乎imread
无法正确检测文件类型。因此,由于我尝试加载的图像为jpg
,readpng
模块会出现运行时错误。
任何人都可以帮我解决一下:
感谢您的帮助。
在@Paul回答并进一步调查之后做了一些澄清。
正如matplotlib.image documentation所说,功能imread()
可以接受输入
字符串路径或类似Python文件的对象。如果提供了format,将尝试读取该类型的文件,否则将从文件名中推断出格式。如果无法推断出任何内容,则尝试使用PNG。
所以我想我的问题应该扩展到为什么在这种特殊情况下使用文件句柄作为输入会导致运行时错误?
答案 0 :(得分:1)
只需输入文件名:
import os
import matplotlib.image as mpimg
class imageThingy(object):
def loadImage(self, im_id):
"""
Load images with image objects.
:param im: a image object in input json file
:return:
"""
im = self.images[im_id]
imgpath = os.path.join(self.image_folder, im['file_path'], im['file_name'])
return mpimg.imread(imgpath)
def plotImage(self, im_id):
fig, ax = plt.subplots()
ax.imshow(img, origin='lower')
return fig
根据文件类型,您可能需要使用origin="lower"
绘制图像。这是因为图像解析器将所有文件类型读入为numpy数组。 numpy的第一个元素总是始终在右上角。但是,有些文件类型在左下角有forigin。因此,它们作为数组翻转。此信息位于您发布的链接中。