python - PIL 图像灰度到 OpenCV 格式
问题描述
我在这里找到了与从 RGB 图像进行更一般转换相关的先前答案:将图像从 PIL 转换为 openCV 格式
我想知道当图像必须以灰度格式读取时的区别。
images = [None, None]
images[0] = Image.open('image1')
images[1] = Image.open('image2')
print(type(images[0]))
a = np.array(images[0])
b = np.array(images[1])
print(type(a))
im_template = cv2.imread(a, 0)
im_source = cv2.imread(b, 0)
我得到以下输出:
<class 'PIL.JpegImagePlugin.JpegImageFile'>
<class 'numpy.ndarray'>
即使我能够将图像转换为 ndarray,cv2 也会说:“内置操作的参数类型错误”。我不需要 RGB 到 BGR 的转换。传递 cv2 读取参数时我还应该考虑什么?
解决方案
你给自己的生活带来了不必要的困难。如果您想将图像加载为灰度,并将其与 OpenCV 一起使用,您应该这样做:
im = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
就这样。无需使用 PIL(速度较慢),无需使用cvtColor()
,因为无论如何您已经浪费了在 BGR 中读取它的所有内存。
如果您绝对想使用 PIL 阅读它(出于某种奇怪的原因),请使用:
import numpy as np
from PIL import Image
# Read in and make greyscale
PILim = Image.open('image.jpg').convert('L')
# Make Numpy/OpenCV-compatible version
openCVim = np.array(PILim)
顺便说一句,如果您想从 OpenCV/Numpy 图像返回 PIL 图像,请使用:
PILim = Image.fromarray(openCVim)
推荐阅读
- python - 终端和 Pycharm 中的“是”操作
- python - 从具有日期范围的 2 个数据帧中获取不重叠的期间
- c# - TcpClient 不从服务器读取响应(.Net 核心)
- flutter - Flutter:禁用 sliverAppBar 填充动画
- json - 如何编写“如果响应正文是 JSON()-able”
- java - 无法通过 jpa 存储库删除记录
- google-analytics - 如何在 GA 中使用 BigQuery 计算数量
- php - 如何为 laravel 提供更多内存
- javascript - jQuery从列表中找到具有确切数字的td
- apache - Apache/mod_perl 随机失败