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()保存图像。
第一个参数是文件名,第二个参数是您要保存的图像。
这会将图像以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()