【问题标题】:Matplotlib does not detect correct file type runtime errorMatplotlib 未检测到正确的文件类型运行时错误
【发布时间】:2014-11-01 00:10:00
【问题描述】:

我正在运行一个 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 似乎无法正确检测文件类型。因此,由于我要加载的图像是 jpgreadpng 模块存在运行时错误。

谁能帮我解答一下:

  1. 这种行为是由什么引起的?
  2. 修复方法是什么?

感谢您的帮助。


@Paul 回答后的一些澄清和进一步调查。

正如matplotlib.image documentation 所说,函数imread() 可以接受作为输入

字符串路径或 Python 文件类对象。如果提供了格式,将尝试读取该类型的文件,否则从文件名中推断出格式。如果什么都不能推导出来,则尝试 PNG。

所以我想我的问题应该扩展到为什么在这种特定情况下使用文件句柄作为输入会导致运行时错误?

【问题讨论】:

    标签: python matplotlib png runtime-error jpeg


    【解决方案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 的第一个元素总是总是在右上角。但是,某些文件类型的来源位于左下角。因此,它们被翻转为数组。此信息在您发布的链接中。

    【讨论】:

    • Paul 这解决了我的问题!非常感谢。你能告诉我以前发生了什么,现在发生了什么变化吗?
    • 但是仍然有一点不起作用(我在问题中的链接中提到了这一点),那就是图像结果打印颠倒了。你也知道如何解决这个问题吗?
    • @Matteo 第一条评论:您正在传递一个文件对象,但 imread 只想要文件的 路径。第二条评论我会在回复中说明。
    • Paul 再次感谢您扩展您的答案,现在很清楚如何解决此问题。我仍然不能完全确定是什么原因造成的(阅读有问题的附加部分),你有什么想法吗?
    • @Matteo 问题的原因是您将打开的文件对象传递给需要字符串形式的文件路径的函数。这就像要了一张机票,但却收到了飞机。这可能是文档中的错误,说明它可以采用类似文件的对象,或者您的文件可能已损坏,或者该文件类型不适用于类似文件的对象。没有完整的示例和图像就无法知道。如果文件路径有效,请使用它。
    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 2020-08-02
    • 2011-10-03
    • 2016-05-23
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多