这篇教学会介绍OpenCV 里imread()、imshow()、waitKey() 方法,透过这些方法,在电脑中使用不同的色彩模式开启图片并显示图片。
imread() 开启图片
使用imread() 方法,可以开启图片,imread() 有两个参数,第一个参数为档案的路径和名称,第二个参数可不填,表示以何种模式( mode ) 开启图片,开启的图片支援常见的jpg、png...等格式,下面是最基本开启图片的程式码。
import cv2
img = cv2.imread('meme.jpg') # 开启图片,预设使用 cv2.IMREAD_COLOR 模式
cv2.imshow('oxxostudio', img) # 使用名为 oxxostudio 的视窗开启图片
cv2.waitKey(0) # 按下任意键停止
cv2.destroyAllWindows() # 结束所有图片视窗
如果设定第二个参数,就能使用不同的色彩模式开启图片,下面的程式码执行后,会以灰阶模式开启图片。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 使用 cv2.IMREAD_GRAYSCALE 模式
# img = cv2.imread('meme.jpg', 2) # 也可使用数字代表模式
cv2.imshow('oxxostudio', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
imshow() 显示图片
在上面的程式码中,使用了imshow() 的方法显示图片,imshow() 包含两个参数,第一个参数为字串,表示要开启图片的视窗名称,第二个参数为使用imread()读取的图片。
waitKey() 等待多久关闭
使用imshow() 方法时会搭配waitKey(),waitKey() 表示等待与读取使用者按下的按键,包含一个单位为「毫秒」的参数,如果设定0 表示持续等待至使用者按下按键为止,下方的程式码设定waitKey 的参数为2000,表示两秒后会关闭图片视窗( 两秒内如果按下q 就会中止计时并关闭视窗)。
如果遇到视窗无法关闭的状况,可以使用destroyAllWindows() 的方法关闭所有视窗,或使用destroyWindow(name) 关闭指定名称的视窗。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 使用 cv2.IMREAD_GRAYSCALE 模式
cv2.imshow('oxxostudio', img)
cv2.waitKey(2000) # 等待两秒 ( 2000 毫秒 ) 后关闭图片视窗
cv2.destroyAllWindows()
色彩模式数字对照表
写入并储存图片
这篇教学会介绍OpenCV 里的imwrite() 方法,实现将图片另存新档( 也可转档) 的功能。
imwrite() 写入并储存图片
使用imwrite() 方法,可以将处理好的资料内容写入并储存为图片,imwrite() 有三个参数,第一个参数为档案的路径和名称,第二个参数为要写入的资料内容,第三个参数为图片压缩品质的设定
下方的程式码执行后,会先用「灰阶模式」开启一张图片,然后再将其存档为压缩品质80 的jpg 和套用预设值的png 图档。
import cv2
img = cv2.imread('meme.jpg', cv2.IMREAD_GRAYSCALE) # 以灰阶模式开启图片
cv2.imwrite('oxxostudio_2.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 80]) # 存成 jpg
cv2.imwrite('oxxostudio_3.png', img) # 存成 png
储存阵列产生的图片
在Python 里,图片可以使用「三维阵列」的方式表现(长宽各多少个像素、每个像素里包含的颜色资讯是什么),因此如果提供特定格式的三维阵列的资料,就能让OpenCV 画出图形。
下面的范例使用numpy 函式库,快速产生500x500,每个项目为[0,0,0] 的三维阵列,接着再让阵列中间的正方形区域的项目设定为[0,0,255],呈现的就是一张500x500 大小,黑色背景,中间200x200 红色正方形的图形,最后使用imwrite() 的方法,就能储存这张图片。
注意!OpenCV 里的颜色为「BGR」,并非RGB,颜色色码为0~255。
import cv2
import numpy as np
img = np.zeros((500,500,3), dtype='uint8') # 快速产生 500x500,每个项目为 [0,0,0] 的三维阵列
img[150:350, 150:350] = [0,0,255] # 将中间 200x200 的每个项目内容,改为 [0,0,255]
cv2.imwrite('oxxostudio.jpg', img) # 存成 jpg
cv2.imshow('oxxostudio', img) # 显示图片
cv2.waitKey(0) # 按下任意键停止
cv2.destroyAllWindows()