使用OpenCV读取图像
使用cv.imread()函数读取图像。
第一个参数为图像名称
第二个参数是一个标志,它指定了读取图像的方式。分别有三种
cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE:以灰度模式加载图像
cv.IMREAD_UNCHANGED:加载图像,包括alpha通道
除了这三个标志,你可以分别简单地传递整数1、0或-1,分别对应为上面三种
import cv2
img=cv2.imread("./photos/000.png",1) #代表为彩色图像
显示图像
使用函数cv.imshow()在窗口中显示图像。第一个参数是窗口名称,它是一个字符串。第二个参数是我们的对象。
使用函数cv2.waitKey(0)是一个键盘绑定函数。其参数是以毫秒为单位的时间。该函数等待任何键盘事件指定的毫秒。如果您在这段时间内按下任何键,程序将继续运行。如果0被传递,它将无限期地等待一次敲击键。
cv2.destroyAllWindows()破坏我们创建的所有窗口,清除内存。
cv2.imshow("dog",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在特殊情况下,你可以创建一个空窗口,然后再将图像加载到该窗口。在这种情况下,你可以指定窗口是否可调整大小。这是通过功能cv.namedWindow()完成的。默认情况下,该标志为cv.WINDOW_AUTOSIZE。但是,如果将标志指定为cv.WINDOW_NORMAL,则可以调整窗口大小。当图像尺寸过大以及向窗口添加跟踪栏时,这将很有帮助。
写入图像
使用函数cv.imwrite()保存图像。
第一个参数是文件名,第二个参数是要保存的图像。 cv.imwrite(‘messigray.png’,img)
这会将图像以PNG格式保存在工作目录中。
import cv2 # 导入OpenCV库
# 读取图片,"./photos/000.png" 是图片的路径,-1 表示以原始格式读取图片(包括alpha通道)
img = cv2.imread("./photos/000.png", -1)
# 使用cv2.imshow显示图片,"dog"是窗口的名字,img是要显示的图片
cv2.imshow("dog", img)
# 等待键盘输入,参数0表示无限等待
key = cv2.waitKey(0)
# 打印按下的键的ASCII码
print(key)
# 判断是否按下了'a'键(注意这里要检查的是ASCII码)
if key == ord('a'):
# 如果是,则关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
# 或者判断是否按下了's'键
elif key == ord('s'):
# 重新以灰度模式读取图片(0 表示灰度模式)
img = cv2.imread("./photos/000.png", 0)
# 将读取的图片保存到"./photos/003.png"
cv2.imwrite("./photos/003.png", img)
print("写入成功")
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
# 注意:如果没有按'a'或's',窗口将保持打开状态,直到你手动关闭它。
使用Matplotlib
Matplotlib是Python的绘图库,可以使用Matplotlib缩放图像,保存图像等
OpenCV加载的彩色图像处于BGR模式。但是Matplotlib以RGB模式显示。因此,如果使用OpenCV读取彩色图像,则Matplotlib中将无法正确显示彩色图像。
#使用Matplotlib
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 使用cv2.imread读取图片,'./photos/001.png'是图片的路径,0表示以灰度模式读取图片
img = cv2.imread('./photos/001.png', 0)
# 使用plt.imshow显示图片
# img是要显示的图片,cmap='gray'指定使用灰度颜色映射,interpolation='bicubic'指定使用双三次插值法来平滑图像
# 双三次插值法是一种在图像处理中常用的插值方法,它可以在放大图像时提供更好的平滑效果
plt.imshow(img, cmap='gray', interpolation='bicubic')
# 隐藏x轴和y轴上的刻度值
# plt.xticks([])和plt.yticks([])分别用于设置x轴和y轴的刻度标签为空列表,即不显示刻度值
plt.xticks([]), plt.yticks([])
# 显示图像
# plt.show()函数会打开一个窗口,显示通过plt.imshow等函数绘制的图像
# 当调用这个函数后,程序会暂停执行,直到你关闭显示的图像窗口
plt.show()
Matplotlib与opencv展示图像区别
import cv2 # 导入OpenCV库
from matplotlib import pyplot as plt # 导入Matplotlib的pyplot模块用于绘图
# 使用cv2.imread读取图片,"./photos/001.png"是图片的路径,1表示以彩色模式读取图片
img = cv2.imread("./photos/001.png", 1)
# 使用cv2.split函数将图片拆分为三个单独的颜色通道:蓝色(b)、绿色(g)、红色(r)
b, g, r = cv2.split(img)
# 使用cv2.merge函数将颜色通道重新合并,但这次是以RGB顺序(红绿蓝),而不是原始的BGR顺序
img2 = cv2.merge([r, g, b])
# 创建第一个子图,占据1行2列中的第1个位置
plt.subplot(121)
# 隐藏x轴和y轴的刻度值
plt.xticks([]), plt.yticks([])
# 使用plt.imshow显示原始BGR格式的图像
plt.imshow(img)
# 创建第二个子图,占据1行2列中的第2个位置
plt.subplot(122)
# 隐藏x轴和y轴的刻度值
plt.xticks([]), plt.yticks([])
# 使用plt.imshow显示转换后的RGB格式的图像
# 注意:在Matplotlib中,默认情况下假设图像是RGB格式的,因此这里会显示正确的颜色
plt.imshow(img2)
# 显示所有子图
plt.show()
# 使用cv2.imshow显示图像
# 第一个窗口显示原始BGR格式的图像,OpenCV读取的图像默认是BGR格式的,所以这里显示的颜色是正确的
cv2.imshow('bgr image', img)
# 第二个窗口显示转换后的RGB格式的图像,但在OpenCV中,它仍然按照BGR的顺序来解释像素值
# 因此,尽管我们尝试以RGB顺序合并颜色通道,但OpenCV在显示时仍会将其视为BGR,导致颜色失真
cv2.imshow('rgb image', img2)
# 等待任意键按下
cv2.waitKey(0)
# 销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()
需要注意的是,在OpenCV中读取和保存图像时,默认的颜色顺序是BGR(蓝绿红),而不是常见的RGB(红绿蓝)。这就是为什么当你将颜色通道重新排序为RGB并使用OpenCV显示时,颜色会看起来失真的原因。Matplotlib则默认处理RGB格式的图像,因此当你使用plt.imshow()显示图像时,如果图像数据是以RGB顺序排列的,它将正确地显示颜色。
Matplotlib图像,左边为BGR 右边为RGB