【问题标题】:CV2 and Pillow give different image shapeCV2 和 Pillow 给出不同的图像形状
【发布时间】:2021-02-23 16:30:24
【问题描述】:

我有一张黑白图像,正在加载到 python 中。如果我使用枕头或 cv2,对于创建的 NumPy 数组的维度,我会得到两个不同的答案。我知道通道排序(RGB 与 BGR)与 openCV 和枕头不同,但我不认为这就是这里发生的事情

我的图像是 2 维的,因为枕头代表它。这是否意味着 openCV 会将值复制到 3D 数组中?

import cv2
from PIL import Image
import numpy as np

path = 'path/to/file.png'

#using pillow
img = Image.open(path)
img.size #(500,500)
img.mode # L
arr = np.array(img)
arr.shape #(500,500)

#using cv2
image = cv2.imread(path)
image.shape #(500,500,3)

如果我在 bash 终端中运行 file

$ file 'path/to/image.png'
path/to/image: PNG image data, 500 x 500, 8-bit grayscale, non-interlaced

【问题讨论】:

  • // 在做什么?他们应该是 cmets 吗?
  • 抱歉,已修复。一时间忘记了我用的是哪种语言。 cmets 显示该行的结果是什么
  • 使用 imread(..., cv2.IMREAD_UNCHANGED)
  • mode "L" 相当于灰度,所以一个通道,cv2.imread("pathimage", cv2.IMREAD_GRAYSCALE) 相当于

标签: python numpy opencv python-imaging-library


【解决方案1】:

cv2.imread 函数有两个参数:文件名和标志。默认情况下,该标志设置为 cv2.IMREAD_COLOR(或 1)。另一方面,PIL 会自动以灰度模式“L”加载您的图像。如果您希望您的 cv2 图像以相同的方式工作,请执行以下操作:

image = cv2.imread(path, cv2.IMREAD_GRAYSCALE)

或者

image = cv2.imread(path, 0)

您还可以将灰度 PIL 图像转换为 3 通道:

img = Image.open(path).convert('RGB')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    相关资源
    最近更新 更多