OpenCV的cv2.imread()函数,通常用于从文件中读取图像。图像被加载为一个numpy数组,可用于进一步的图像处理或转换操作。虽然这是一个相当简单的函数,但cv2的imread有许多不为人知的特性。在这篇文章中,我们将对Python OpenCV的cv2.imread()函数进行详细的解释,并举例说明。最后,我们将讨论常见的错误
AttributeError:'NoneType'对象没有
与imread相关的
属性
。
还可以阅读 -
OpenCV cv2.imwrite()的提示和技巧,没有人告诉你
的。
OpenCV cv2.imread()函数的语法
cv2.imread()的语法如下
cv2.imread(文件名[, 标志])
**filename -**要读取的图像文件的路径和名称。
**flag -**这是可选的,表示应该如何读取图像。标志值可以是以下的一个----。
标志值
|
描述
|
cv2.IMREAD_UNCHANGED 或 -1
|
读取图像,不做任何改变,保留alpha通道
|
cv2.IMREAD_COLOR 或 1
|
读取BGR颜色格式的图像,并删除alpha通道 这是标志的默认值
|
cv2.IMREAD_GRAYSCALE 或 0
|
以灰度格式读取图像。
|
cv2.IMREAD_REDUCED_GRAYSCALE_2
|
以灰度读取图像,将图像大小减少到一半。
|
cv2.IMREAD_REDUCED_COLOR_2
|
读取BGR格式的图像,去掉alpha通道,并将图像大小减少到一半。
|
cv2.IMREAD_REDUCED_GRAYSCALE_4
|
读取灰度格式的图像,将图像大小减少到四分之一。
|
cv2.IMREAD_REDUCED_COLOR_4
|
读取BGR格式的图像,去掉alpha通道,将图像大小减少到四分之一。
|
cv2.IMREAD_REDUCED_GRAYSCALE_8
|
读取灰度格式的图像,将图像大小减少到八分之一。
|
cv2.IMREAD_REDUCED_COLOR_8
|
读取BGR格式的图像,去掉alpha通道,并将图像大小减少到1/8。
|
cv2.IMREAD_ANYDEPTH
|
当输入的图像有相应的深度时,返回16位/32位图像,否则转换为8位。
|
cv2.IMREAD_ANYCOLOR
|
以任何可能的颜色读取图像
|
cv2.IMREAD_LOAD_GDAL
|
使用gdal驱动来加载图像。
|
cv2.IMREAD_IGNORE_ORIENTATION
|
不根据EXIF的方向标志旋转图像。
|
cv2 imread函数支持的文件格式
你可以用OpenCV的imread()函数读取以下文件格式。
文件格式
|
扩展名
|
便携式网络图形
|
*.png
|
便携式图像格式
|
*.pbm, *.pgm, *.ppm *.pxm, *.pnm
|
Windows位图
|
*.bmp
|
JPEG文件
|
*.jpeg, *.jpg, *.jpe
|
JPEG 2000文件
|
*.jp2
|
WebP
|
*.webp
|
PFM文件
|
*.pfm
|
太阳光栅
|
*.sr, *.ras
|
OpenEXR图像文件
|
*.exr
|
辐射率HDR
|
*.hdr, *.pic
|
TIFF文件
|
*.tiff, *.tif
|
cv2.imread() OpenCV Python的例子
例子中的图像样本
在下面的所有例子中,我们将使用上述尺寸为399x 625的图像。这张图片是透明背景的png格式,因此除了三个蓝、红、绿通道外还有一个alpha通道。所以总的来说,这张图片有4个通道。
导入OpenCV库
首先,让我们导入OpenCV库,如下图所示。
在[0]中。
import cv2
例子1 - 读取带有默认标志值的图像
在第一个例子中,我们用imread()函数读取样本图像,没有传递任何其他标志值。读取图像后,我们可以观察到它显示了3个通道(对于BGR通道),而不是实际图像中的4个。
这是因为这里的标志的默认值被用作cv2.IMREAD_COLOR,它已经删除了alpha通道。
In[1]:
#read image
Out[1]:
Image Dimension is (399, 625, 3)
Image Height is 399
Image Width is 625
Number of Channels is 3
例2--用标志值cv2.IMREAD_COLOR读取图像
接下来,我们使用cv2.IMREAD_COLOR的标志值,可以看到它给出的通道数是3(与第一个例子的输出相同)。因此,它验证了用cv2.IMREAD_COLOR这个标志值去除alpha通道的事实,而这个标志值也恰好是默认的标志值。
In[2]:
#read image
输出[2]。
Image Dimension is (399, 625, 3)
Image Height is 399
Image Width is 625
Number of Channels is 3
Example 3 - imread() with Flag Value cv2.IMREAD_UNCHANGED
cv2.IMREAD_UNCHANGED确保cv2.imread读取的图像是原样的,甚至保留了alpha通道。从下面的输出中可以看出,这次的通道数是4。
In[3]:
#read image
Out[3]:
Image Dimension is (399, 625, 4)
Image Height is 399
Image Width is 625
Number of Channels is 4
Example 4 - imread() with Flag Value cv2.IMREAD_GRAYSCALE
cv2.IMREAD_GRAYSCALE的标志值使imread()函数能够以灰度读取图像。
在下面的例子的输出中,没有通道,因为图像是以灰度读取的。
In[4]:
#read image
输出[4]。
Image Dimension is (399, 625)
Image Height is 399
Image Width is 625
例5 - 使用标志值cv2.IMREAD_REDUCED_COLOR_2
cv2.IMREAD_REDUCED_COLOR_2以BGR格式读取图像,同时将图像大小减少一半。在下面的例子中也可以看到,图像的尺寸从原来的399×625变成了199×312。
In [5]:
#read image
输出[5]。
Image Dimension is (199, 312, 3)
Image Height is 199
Image Width is 312
Number of Channels is 3
例6 - 使用标志值cv2.IMREAD_REDUCED_COLOR_4
cv2.IMREAD_REDUCED_COLOR_2以BGR格式读取图像,同时将图像大小减少四分之一。
在下面的例子中,图像被缩小到99×156,是原始图像的四分之一。
In [6]:
#read image
输出[6]。
Image Dimension is (99, 156, 3)
Image Height is 99
Image Width is 156
Number of Channels is 3
例子7-- 使用标志值cv2.IMREAD_REDUCED_COLOR_8
cv2.IMREAD_REDUCED_COLOR_8以BGR格式读取图像,同时将图像的大小减少八分之一。
在下面的例子中,图像被缩小到49×78,是原始图像的八分之一。
In [7]:
#read image
输出[7]。
Image Dimension is (49, 78, 3)
Image Height is 49
Image Width is 78
Number of Channels is 3
例子8 - 标志值 cv2.IMREAD_REDUCED_GRAYSCALE_2
cv2.IMREAD_REDUCED_GRAYSCALE_2标志值以灰度读取图像,并在加载图像时将其减少一半。
在下面的例子中,图像是以灰度加载的,图像大小被缩小到199×312,是原始图像的一半。
In[8]:
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_2 )
print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
输出[8]。
Image Dimension is (199, 312)
Image Height is 199
Image Width is 312
例子9 - 标志值 cv2.IMREAD_REDUCED_GRAYSCALE_4
cv2.IMREAD_REDUCED_GRAYSCALE_4标志值以灰度读取图像,并在加载图像时将其大小减少到四分之一。
在下面的例子中,图像是以灰度加载的,图像大小被缩小到99×156,是原始图像的四分之一。
In[9]:
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_4 )
print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
输出[9]。
Image Dimension is (99, 156)
Image Height is 99
Image Width is 156
例子 10 - 标志值 cv2.IMREAD_REDUCED_GRAYSCALE_8
cv2.IMREAD_REDUCED_GRAYSCALE_8标志值以灰度读取图像,并在加载时将图像大小减少到1/8。
在下面的例子中,图像是以灰度加载的,图像大小被缩小到49×78,是原始图像的八分之一。
In[10]:
img=cv2.imread("animals.png", cv2.IMREAD_REDUCED_GRAYSCALE_8 )
print('Image Dimension is',img.shape)
print('Image Height is',img.shape[0])
print('Image Width is',img.shape[1])
输出[10]。
Image Dimension is (49, 78)
Image Height is 49
Image Width is 78
cv2.imread() 陷阱警报 - 属性错误:'nonetype'对象没有属性
对于初学者来说,很常见的是被attributeeerror: 'nonetype' object has no attribute 的错误所困扰,他们无法解决这个问题,几个小时后才意识到,他们把错误的图像文件名或路径传给了imread函数。
是的!如果文件名是错误的,imread函数不会抛出任何错误,但当你试图在后续步骤中执行一些操作时,你开始看到属性错误:'nonetype'对象没有属性,让你感到困惑。
cv2.imread()如果成功读取图像,会创建一个numpy.ndarray类型的对象,如下所示。
In[11]:
#read image
Out[11]:
numpy.ndarray
但是当我们试图读取一个不正确的图像文件名或路径时,imread创建了一个NoneType的对象,但没有给出任何错误来表明文件名或路径不正确。
在[12]。
#read image
Out[12]:
NoneType
而现在,如果你随后试图对它进行任何操作,你将开始得到错误。例如,如果你试图获取形状,你会得到错误AttributeError: 'NoneType' 对象没有属性'shape'。
在[13]。
img.shape
Out[13]:
还可以阅读 - 没有人告诉你的OpenCV cv2.imwrite()的技巧和窍门
参考资料 -OpenCV文档
The postOpenCV cv2.imread()的提示和技巧,你不知道的出现在MLK - Machine Learning Knowledge上。