Python 为什么在使用PIL和cv2加载时,图像的宽度和高度会发生反转?

Python 为什么在使用PIL和cv2加载时,图像的宽度和高度会发生反转?,python,image,python-imaging-library,cv2,dimensions,Python,Image,Python Imaging Library,Cv2,Dimensions,我正在使用PIL和cv2软件包加载。使用PIL加载图像时,高度和宽度与使用cv2加载图像时相反。下面是使用这两个软件包打印加载图像的高度和宽度的代码 file = 'conceptual_captions/VL-BERT/data/conceptual-captions/val_image/00002725.jpg' # load image using PIL import PIL.Image pil = PIL.Image.open(file).convert('RGB') w, h = p

我正在使用
PIL
cv2
软件包加载。使用
PIL
加载图像时,高度和宽度与使用
cv2
加载图像时相反。下面是使用这两个软件包打印加载图像的高度和宽度的代码

file = 'conceptual_captions/VL-BERT/data/conceptual-captions/val_image/00002725.jpg'
# load image using PIL
import PIL.Image
pil = PIL.Image.open(file).convert('RGB')
w, h = pil.size
print("width: {}, height: {}".format(w, h))
打印输出
宽度:1360,高度:765

# now using cv2
import cv2
im = cv2.imread(file)
print("height, width, channels: {}".format(im.shape)) 
打印输出<代码>高度、宽度、通道:(1360、765、3)

我下载了图像,并使用Mac上的info选项检查了图像的大小。信息具有
宽度=765和
高度= 1360
,与cv2
方法报告的相同。为什么
PIL
给出了错误的图像尺寸


问题发生在很少的图像上。我链接的图像就是这样一个图像。对于其余的图像,由
PIL
cv2
报告的高度和宽度是相同的。

图像有一些EXIF元数据,包括有关方向(旋转)的信息。我建议阅读问答和随后的参考资料

尽管如此,建议的解决方案现在可以简化,只需使用:

如果图像具有EXIF方向标记,则返回相应转置的新图像。否则,返回图像的副本

要测试的一些代码:

从PIL导入图像,ImageOps
#阅读原始图像,显示宽度和高度
文件='…'
pil=Image.open(file.convert('RGB'))
w、 h=桩号
打印(“宽度:{},高度:{}”。格式(w,h))
#关于EXIF数据的转置
pil=ImageOps.exif_转置(pil)
w、 h=桩号
打印(“宽度:{},高度:{}”。格式(w,h))
相应的输出:

宽度:1360,高度:765 宽:765,高:1360
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
枕头:7.2.0
----------------------------------------

图像包含一些EXIF元数据,包括有关方向(旋转)的信息。我建议阅读问答和随后的参考资料

尽管如此,建议的解决方案现在可以简化,只需使用:

如果图像具有EXIF方向标记,则返回相应转置的新图像。否则,返回图像的副本

要测试的一些代码:

从PIL导入图像,ImageOps
#阅读原始图像,显示宽度和高度
文件='…'
pil=Image.open(file.convert('RGB'))
w、 h=桩号
打印(“宽度:{},高度:{}”。格式(w,h))
#关于EXIF数据的转置
pil=ImageOps.exif_转置(pil)
w、 h=桩号
打印(“宽度:{},高度:{}”。格式(w,h))
相应的输出:

宽度:1360,高度:765 宽:765,高:1360
----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
枕头:7.2.0
----------------------------------------

调用
width,height=cv.GetSize(im)
时会得到什么结果,这是一种有文档记录的获取宽度和高度的方法?@FrankYellin我在运行命令
width,height=cv.GetSize(im)
时出错。另外,在“访问图像属性”部分中提到使用
im.shape
。你能链接到使用
GetSize()
的文档吗?哦,太好了。我看到的一个文档提到了GetSize(),另一个没有。很抱歉。但是肯定
pil.size
返回宽度和高度,而
im.shape
返回高度和宽度。那不是你看到的?(您没有显示打印语句的结果,只是显示您对结果的解释。)@FrankYellin我已经用精确的打印输出更新了问题。我看不出您使用
PIL
.size
有任何错误。我想知道您的问题是否与
打印有关
?当您调用
宽度,高度=cv.GetSize(im)
,这是一种记录在案的获取宽度和高度的方法时,您会得到什么结果?@FrankYellin我在运行命令
宽度,高度=cv.GetSize(im)
时出错。另外,在“访问图像属性”部分中提到使用
im.shape
。你能链接到使用
GetSize()
的文档吗?哦,太好了。我看到的一个文档提到了GetSize(),另一个没有。很抱歉。但是肯定
pil.size
返回宽度和高度,而
im.shape
返回高度和宽度。那不是你看到的?(您没有显示打印语句的结果,只是显示您对结果的解释。)@FrankYellin我已经用精确的打印输出更新了问题。我看不出您使用
PIL
.size
有任何错误。我想知道您的问题是否出在
print
?建议的编辑在
Pillow7.2.0
Python3.6.8
上运行。它在
6.2.0
python3.7.4
上不起作用。在后面的配置中,调用
ImageOps.exif\u transpose(pil)
时出现错误。在我接受答案之前,我有一个相关的问题
exif_transpose()
正在将图像转换为正确的方向,这是
cv2.imread
自动执行的。对吗?建议的编辑在
7.2.0
python3.6.8
上运行。它在
6.2.0
python3.7.4
上不起作用。在后面的配置中,调用
ImageOps.exif\u transpose(pil)
时出现错误。在我接受答案之前,我有一个相关的问题
exif_transpose()
正在将图像转换为正确的方向,这是
cv2.imread
自动执行的。对吗?