PIL 裁剪图像返回一个有趣的 PIL.Image._ImageCrop 数据类型

Posted

技术标签:

【中文标题】PIL 裁剪图像返回一个有趣的 PIL.Image._ImageCrop 数据类型【英文标题】:PIL cropped images return a funny PIL.Image._ImageCrop datatype 【发布时间】:2012-06-02 13:36:20 【问题描述】:

cropped_image = image.crop( cords ) 正常工作时,它会返回一个与 Scipy 的assaray 一起工作的Image 对象:

bitmap <PIL.Image.Image image mode=RGBA size=1600x1200 at 0xAC9CFEC>
#SCIPY'S ASARRAY WORKS PROPERLY!
pic!! [[[ 16  18  31 255]
  [ 16  18  31 255]
  [ 16  18  31 255]
  ..., 

但现在我得到了一个失败的 PIL.Image._ImageCrop 对象。

bitmap <PIL.Image._ImageCrop image mode=RGBA size=1600x80 at 0x99635AC>
#SCIPY'S ASARRAY FAILS WITHOUT WARNING
pic!! <PIL.Image._ImageCrop image mode=RGBA size=1600x80 at 0x99635AC>
Traceback (most recent call last):
  File "/root/dev/spectrum/final/image_handler.py", line 216, in on_left_down
    self._sample_callback()
  File "/root/dev/spectrum/final/image_handler.py", line 237, in _sample_callback
    self.__callback_function( sample )
  File "/root/dev/spectrum/final/plot_handler.py", line 117, in __init__
    self.InitUI()
  File "/root/dev/spectrum/final/plot_handler.py", line 163, in InitUI
    self.canvas_panel.draw(self.__crop_section)
  File "/root/dev/spectrum/final/plot_handler.py", line 78, in draw
    pic_avg     = pic.mean(axis=2)
ValueError: axis(=2) out of bounds

为什么会出现这样的问题?

【问题讨论】:

尝试改用scipy.ndimage。如果失败,请发布一些重现问题的代码。 【参考方案1】:

这是一种无声的失败,源于两种情况:

首先,crop 方法提供了非整数数字。

其次,the crop operation happens to be a lazy operation,只有在调用.load() 方法时才会进行裁剪(我对此不清楚,如果您了解更多请编辑此内容!)。

因此裁剪操作没有发生,也没有发出明显的信号。给它有效的坐标解决了这个问题。

【讨论】:

以上是关于PIL 裁剪图像返回一个有趣的 PIL.Image._ImageCrop 数据类型的主要内容,如果未能解决你的问题,请参考以下文章

为`PIL.Image.frombytes`指定啥大小

Python 中的 PIL.Image.merge()用法示例 (还没弄懂)

pytorch图像基本操作

pytorch图像基本操作

python中PIL.Image和OpenCV图像格式相互转换

如何将 Matplotlib 图形转换为 PIL Image 对象(不保存图像)