OPENCV(图像入门笔记)

发布于:2024-07-06 ⋅ 阅读:(41) ⋅ 点赞:(0)

使用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
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到