OpenCV3计算机视觉Python语言实现笔记(一)

1. 读/写图像文件

  OpenCV的imread()函数imwrite()函数能支持各种静态图像文件格式。不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG、JPEG和TIFF格式。

  无论哪种格式,每个像素都会有一个值,但不同格式表示像素的方式有所不同。如:

复制代码

import cv2
import numpy as np

img = np.zeros((3, 3), dtype = np.uint8)    # 通过二维NumPy数组来简单创建一个黑色的正方形图像
print(img)                                  # 在控制台打印该图像
print(img.shape)                            # 通过shape属性来查看图像的结构,返回行和列,如果有一个以上的通道,还会返回通道数
img = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)  # 利用cv2.cvtColor函数将该图像转换成BGR格式
print(img)
print(img.shape)
cv2.namedWindow("Image")                    # 显示该图像
cv2.imshow("Image", img)
cv2.waitKey (0)

复制代码

结果为:

  [[0 0 0]       
   [0 0 0]
   [0 0 0]]    

# 每个像素都由一个8位整数来表示,即每个像素值的范围是0~255

  (3, 3)

  [[[0 0 0]
    [0 0 0]
    [0 0 0]]

   [[0 0 0]
    [0 0 0]
    [0 0 0]]

   [[0 0 0]
    [0 0 0]
    [0 0 0]]]  

# 现在每个像素都由一个三元数组表示,并且每个整型向量分别表示一个B,G和R通道。其他色彩空间(如HSV)也以同样的方式来表示像素,只是取值范围和通道数目不同(例如,HSV色彩空间的色度值范围为0~180)

  (3, 3, 3)  

# 此时每个像素有3通道

  可读取一种格式的图像文件,然后将其保存为另一种格式。如:

import cv2
image = cv2.imread('flower.jpg')  # 将‘flower.jpg’的图片与.py文件放在同一目录下,或者使用绝对路径
cv2.imwrite('flower.png',image)

  程序运行后,可看到文件夹中多了'flower.png'的图片

           

  在默认情况下,即使图像文件为灰度格式,imread()函数也会返回BGR格式的图像,BGR与RGB表示的色彩空间相同,但字节顺序相反。

  下面列出的选项可作为imread()函数的参数:

    IMREAD_ANYCOLOR = 4

    IMREAD_ANYDEPTH = 2

    IMREAD_COLOR = 1:加载彩色图像。图像的任何透明度都将被忽略,这是默认标志。

    IMREAD_GARYSCALE = 0:以灰度模式加载图像

    IMREAD_LOAD_GDAL = 8

    IMREAD_UNCHANGED = -1:加载图像,包括alpha通道

    cv2.imread(‘图像名称’,’可选参数’) 
      可选参数决定读入图像的模式: 
      0:读入的为灰度图像(即使图像为彩色的) 
      1:读入的图像为彩色的(默认); 

  如下面的例子将加载的PNG文件作为灰度图像(在这个过程中会丢失所有的颜色信息),然后又将其保存为灰度的PNG图像。

import cv2
import numpy as np

garyImage = cv2.imread('flower.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imwrite('flower.png',garyImage)

  程序运行后,文件夹中出现了灰度图像

              

Warning:

在调用imread的时候,图像路径错误,但是如果print(garyImage)的话,python编译器不会报任何错误,但会回传None。


  无论采用哪种模式,imread()函数会删除所有alpha通道的信息(透明度)。imwrite()函数要求图像为BGR或灰度格式,并且每个通道要有一定的位(bit),输出格式要支持这些通道。例如,bmp格式要求每个通道有8位,而PNG允许每个通道有8位或16位

  储存图像函数:cv2.imwrite(‘保存的图像名’,图像,‘参数’) 
  正常的图像储存使用就是cv2.imwrite(‘保存的图像名’,图像),后面一个参数默认,保存的图像名还得带类型,比如jpg,bmp等等,OpenCV目前支持读取bmp、jpg、png、tiff等常用格式,第三个参数较复杂,还得分是jpg、bmp等等图像的类型不同而不同,其实就是决定了图像储存大小,清晰度的,默认的就很好.


下面是我根据官方文档自己补充的:

显示图像

使用函数cv.imshow()在窗口中显示图像。窗口自动适合图像尺寸。

第一个参数是窗口名称,它是一个字符串。第二个论点是img。您可以根据需要创建任意多个窗口,但需要使用不同的窗口名称。

import cv2 as cv
# Load a color image in grayscale
img = cv.imread('flower.jpg',0)
cv.imshow('flower.jpg',img)
cv.waitKey(0)
cv.destroyAllWindows()

窗口的屏幕截图如下所示:

 

cv.waitKey()是键盘绑定功能。它的参数是时间(以毫秒为单位)。该函数将为任何键盘事件等待指定的毫秒数。如果在此期间按任意键,程序将继续。如果传递 0,它将无限期地等待击键。还可以将其设置为检测特定的按键,例如是否按下了按键a,我们将在下面讨论。

注意

除了绑定键盘事件之外,此功能还处理许多其他GUI事件,因此必须使用它来实际显示图像。

cv.destroyAllWindows()只会破坏我们创建的所有窗口。如果要销毁任何特定的窗口,请使用函数 cv.destroyWindow()在其中传递确切的窗口名称作为参数。

注意

在特殊情况下,您可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,您可以指定窗口是否可调整大小。这是通过功能cv.namedWindow()完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。

请参见下面的代码:

import cv2 as cv
# Load a color image in grayscale
img = cv.imread('flower.jpg',0)
cv.namedWindow('Flower',cv.WINDOW_NORMAL)
cv.imshow('Flower',img)
cv.waitKey(0)
cv.destroyAllWindows()

写图像

使用函数cv.imwrite()保存图像。

第一个参数是文件名,第二个参数是您要保存的图像。

cv.imwrite'messigray.png',img)

这会将图像以PNG格式保存在工作目录中。

总结一下

在下面的程序中,以灰度加载图像,显示图像,按“ s”保存图像并退出,或者按ESC键直接退出而不保存。

import numpy as np
import cv2 as cv
img = cv.imread('flower.jpg',0)
cv.imshow('image',img)
k = cv.waitKey(0)
if k == 27:         # wait for ESC key to exit
    cv.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
    cv.imwrite('flowergray.png',img)
    cv.destroyAllWindows()
发布了12 篇原创文章 · 获赞 16 · 访问量 439

猜你喜欢

转载自blog.csdn.net/qq_41982039/article/details/103727768