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上。

    分类:
    人工智能
  • AirtestProject Python
  •