📜  Python Opencv 基础 1: imread 读取图像

📅  最后修改于: 2020-08-25 01:23:27             🧑  作者: Mango

在上一节中,我们主要学习了在Python中显示图像https://www.imangodoc.com/4417.html

在本节中,我们主要学习如何利用imread读取图像数据。

揭幕OpenCV cv2.imread()

您可以使用opencv库将图像读取到numpy数组中。该阵列包含像素级数据。并且根据要求,您可以通过更新数组值来修改像素级别的图像数据, 如果想熟练的掌握numpy的相关操作,你可以阅读我们相关文章https://www.imangodoc.com/3495.html

要使用OpenCV在Python中读取图像,请使用cv2.imread()函数。imread()根据图像中存在的颜色通道数返回2D或3D矩阵。对于二进制或灰度图像,二维数组就足够了。但是对于彩色图像,您需要3D阵列。

 

cv2.imread(image_path, flag)

其中/路径/到/图片必须是图像完整的绝对路径。该标志是可选的,并且可以为该标志传递以下可能的值之一

  • cv2.IMREAD_COLOR读取具有RGB颜色但没有透明通道的图像。当没有提供值作为cv2.imread()的第二个参数时,这是标志的默认值。
  • cv2.IMREAD_GRAYSCALE将图像读取为灰色图像。如果源图像是彩色图像,则通过取彩色通道的平均值来计算每个像素的灰度值,并将其读入阵列。
  • cv2.IMREAD_UNCHANGED从源读取图像。如果源图像是RGB,则它将图像加载到具有红色,绿色和蓝色通道的阵列中。如果源图像是ARGB,则它将加载具有三个颜色分量以及alpha或透明度通道的图像。

示例1:OpenCV cv2读取彩色图像

在此示例中,我们将读取彩色图像。由于flag参数的默认值为cv2.IMREAD_COLOR,因此我们没有显式传递该标志。

opencv 默认读入未BGR图像

import cv2
#read image
img = cv2.imread('./image.jpg')
#print its shape
print('Image Dimensions :', img.shape)

运行上面的python程序,您将获得输出Image Dimensions : (400, 640, 3), 说明是一个3D的张量,分别代表(高度,宽度,通道数)。图像的高度为400像素,宽度为640,图像中有三个颜色通道。对于cv2.IMREAD_COLOR,即使存在透明通道也将被忽略。

示例2:OpenCV cv2 –以灰度读取图像

在此示例中,我们将图像读取为灰度图像。输入可以是彩色图像或灰度图像。但是,如果flag参数为cv2.IMREAD_GRAYSCALE,则将图像读取为灰度图像。

import cv2
 
img = cv2.imread('D:/image-1.png', cv2.IMREAD_GRAYSCALE)
 
print('Image Dimensions :', img.shape)

输出:Image Dimensions : (400, 640),只有一个通道。

示例3:OpenCV cv2 –使用透明通道读取图像

在此示例中,我们将读取具有透明通道的图像。如果图像中有透明通道,则可以传递cv2.IMREAD_UNCHANGED来读取透明通道以及颜色通道。

import cv2
 
img = cv2.imread('D:/image-1.png', cv2.IMREAD_UNCHANGED)
 
print('Image Dimensions :', img.shape)

输出:Image Dimensions : (400, 640,4)图像拥有有四个通道。即红色,绿色,蓝色和透明性。

分别获取不同的颜色通道

imread()将图像解码成矩阵,并分别以Blue,Green,Red和A(透明性)的顺序存储色彩通道。

如果(400,640,4)是图像的形状,则

  • (:,:,0)代表蓝色通道
  • (:,:,1)代表绿色通道
  • (:,:,2)代表红色通道
  • (:,:,3)代表透明通道

你也可以通过opencv自带的函数cv2.split(image)来获取不同的通道,返回格式为List,分别代表B,G,R,A。

imread()和文件扩展名

基于操作系统,压缩技术等,有许多用于图像的扩展名。

当imread()方法读取图像时,它不会考虑图像文件名的扩展名来确定图像的格式。但是根据文件数据中存在的格式决定扩展名。

imread()在所有平台上都支持JPEG,PNG和TIFF。但是对于其他格式和操作系统的组合,imread()可能会考虑操作系统级别的编解码器。对于这些特殊情况,您可以参考imread()的官方文档。

 

——>>>>感谢你的阅读与支持