OpenCV 和 PIL 图像大小不匹配

4

我发现了一个非常奇怪的jpeg文件(b.jpg)。

根据你使用的库不同,这张图片的大小也不同,无论是PIL还是opencv。

为了进行比较,我创建了一张普通的图片a.jpg。

以下代码显示这两个库返回的大小不同!

这个b.jpg到底是怎么回事?

import cv2
from PIL import Image
a_path = "a.jpg"
b_path = "b.jpg"
PIL_a = Image.open(a_path)
CV2_a = cv2.imread(a_path)
PIL_b = Image.open(b_path)
CV2_b = cv2.imread(b_path)

PIL_a.size  # width, height
>> (235, 149)
CV2_a.shape[1], CV2_a.shape[0]  # width, height
>> (235, 149)

PIL_b.size  # width, height
>> (5312, 2988)
CV2_b.shape[1], CV2_b.shape[0]  # width, height
>> (2988, 5312)   <-- strange

a.jpg:a.jpg

b.jpg:b.jpg


2
@Miki 我知道。再看一遍代码。我打印了 shape[1],shape[0]。 - Cauchy
2
@PiotrSiekański 我认为这个问题不被视为真正的重复,因为它比较了OpenCV和PIL的结果。(SO允许重复的答案 - 许多答案基于其他答案)。 - Rotem
1个回答

4

原因是 EXIF 方向标签

  • OpenCV 的 cv2.imread 方法会查找方向标签,然后相应地旋转/翻转图像。
  • Image.open 不会查找方向标签 - 您可以通过编程方式来解决它。

这是一个代码示例,用于重现您的情况(您需要使用ExifTool进行执行):

import numpy as np
import cv2
from PIL import Image
import subprocess as sp
import shlex

# Build synthetic image
img = np.full((100, 300, 3), 60, np.uint8)
cv2.putText(img, '1', (130, 70), cv2.FONT_HERSHEY_DUPLEX, 2, (255, 30, 30), 4)  # Blue number

cv2.imwrite('image.jpg', img)

# Change the orientation by setting "orientation" exif tag:
# https://superuser.com/questions/435443/how-can-i-modify-the-exif-orientation-tag-of-an-image
sp.run(shlex.split('exiftool -orientation=5 -n image.jpg'))  # Mark image as rotated.

cv_img = cv2.imread('image.jpg')
print((cv_img.shape[1], cv_img.shape[0]))  # (100, 300)

pil_img = Image.open('image.jpg')
print(pil_img.size)  # (300, 100)
pil_img.show()

cv2.imshow('cv_img', cv_img)
cv2.waitKey()
cv2.destroyAllWindows()

pil_img.show():
这是一张图片描述

cv2.imshow('cv_img', cv_img):
这是一张图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接