python3中opencv图片读取与展示
图像入门
目标
- 在这里你将学会怎样读入一幅图像,怎样显示一幅图像,以及如何保存一幅图像
- 你将学习这些函数:cv2.imread(),cv2.imshow(),cv2.imwrite()
- 或者,您将学习如何使用Matplotlib显示图像
读入图像
使用函数cv2.imread()来读取图像。图像应该在工作目录中,或者应该给出图像的完整路径。
imread(filename[, flags]) -> retval
函数imread从指定文件加载图像并返回一个numpy.ndarray对象类型像素值。 如果图像无法读取(由于文件丢失,权限不当,格式不受支持或格式无效),函数返回一个空矩阵
第二个参数是一个标志,用于指定应读取图像的方式。
- cv2.IMREAD_COLOR:加载彩色图像。图像的任何透明度都将被忽略。这是默认标志。 flags=1
- cv2.IMREAD_GRAYSCALE:以灰度模式加载图像 flags=0
- cv2.IMREAD_UNCHANGED:加载包含Alpha通道的图像 flags=-1
注意
而不是这三个标志,你可以简单地传递整数1,0或-1。
如:
import cv2
import numpy
# Load an color image in color
img = cv2.imread("image0.jpg", 1)
img
array([[[ 34, 36, 30],
[ 33, 35, 29],
[ 31, 33, 27],
...,
[ 85, 110, 60],
[ 85, 110, 60],
[ 85, 110, 60]],
[[ 32, 34, 28],
[ 31, 33, 27],
[ 30, 32, 26],
...,
[ 80, 107, 57],
[ 81, 106, 56],
[ 81, 106, 56]],
[[ 31, 33, 27],
[ 31, 33, 27],
[ 30, 32, 26],
...,
[ 80, 107, 57],
[ 77, 104, 54],
[ 77, 104, 54]],
...,
[[ 11, 16, 19],
[ 13, 15, 15],
[ 15, 19, 14],
...,
[ 16, 16, 16],
[ 9, 11, 11],
[ 10, 12, 12]],
[[ 11, 16, 19],
[ 13, 15, 15],
[ 15, 19, 14],
...,
[ 16, 16, 16],
[ 14, 16, 16],
[ 15, 17, 17]],
[[ 11, 16, 19],
[ 13, 15, 15],
[ 15, 19, 14],
...,
[ 16, 16, 16],
[ 17, 19, 19],
[ 17, 19, 19]]], dtype=uint8)
警告:就算图像的路径是错的,OpenCV 也不会提醒你的,但是当你使用命令print img时得到的结果是None。
显示图像
使用函数 cv2.imshow() 显示图像。窗口会自动调整为图像大小。第一
个参数是窗口的名字,其次才是我们的图像。你可以创建多个窗口,只要你喜
欢,但是必须给他们不同的名字
cv2.imshow("image",img)
cv2.waitKey (0)
cv2.destroyAllWindows()
cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫
秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果
按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没
有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限
期的等待键盘输入。它也可以被用来检测特定键是否被按下,例如按键 a 是否
被按下,这个后面我们会接着讨论。
cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果
你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删
除的窗口名。
建 议:一 种 特 殊 的 情 况 是, 你 也 可 以 先 创 建 一 个 窗 口, 之 后再 加 载 图 像。 这 种 情 况 下, 你 可 以 决 定 窗 口 是 否 可 以* 调 整大 小*。 使 用 到 的 函 数 是 cv2.namedWindow()。 初 始 设 定 函 数标 签 是 cv2.WINDOW_AUTOSIZE。 但 是 如 果 你 把 标 签 改 成cv2.WINDOW_NORMAL,你就可以调整窗口大小了。当图像维度太大,或者要添加轨迹条时,调整窗口大小将会很有用
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
保存图像
使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才是你要保存的图像。
cv2.imwrite("messigray.png", img)
True
总结一下
下面的程序将会加载一个灰度图, 显示图片,按下’s’键保存后退出,或者
按下 ESC 键退出不保存。
import numpy as np
import cv2
img = cv2.imread('image0.jpg',0)
cv2.imshow('image',img)
k = cv2.waitKey(0)
if k == 27: # wait for ESC key to exit 如果 按下任意键,这个函数会返回按键的 ASCII 码值
cv2.destroyAllWindows()
elif k == ord('s'): # wait for 's' key to save and exit
cv2.imwrite('messigray.png',img)
cv2.destroyAllWindows()
警告:如果你用的是 64 位系统,你需要将 k = cv2.waitKey(0) 这行改成k = cv2.waitKey(0)&0xFF。
使用 Matplotlib
Matplotib 是 python 的一个绘图库,里头有各种各样的绘图方法。之后会陆续了解到。现在,你可以学习怎样用 Matplotib 显示图像。你可以放大图像,保存它等等。
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('image0.jpg',0)
# print(img)
# img2 = img[:,:,::-1]
plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
plt.xticks([]), plt.yticks([]) # to hide tick values on X and Y axis
plt.show()
参见:Matplotib 有多种绘图选择。具体可以参见 Matplotib docs。我们也会陆续了解一些
注意:彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotib 是 RGB模式。所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotib 正确显示。具体细节请看练习
使用opencv读取RGB图片时,使用matplotlib会出现如下图所示的情况,这是因为opencv使用的是BGR模式,而matplotlib使用的是RGB模式,如果想要使用matplotlib加载opencv读取的图片,需要将其转换成为RGB模式。
第一种方法:
b,g, r = cv2.split(img)
img2 = cv2.merge([r,g,b])
第二种方法:更加简洁的转换方法
img2 = img[:,:,::-1]
第三种方法:
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)