文章目录
- 一、认识计算机中的图像
- 二、图像数据的读取
- 三、数据读取-视频
- 四、图像的其他操作
一、认识计算机中的图像
一张彩色图片是由很多个像素点组合而成的,而一个像素点是由R G B三个通道组成。RGB代表红色(Red)、绿色(Green)、蓝色(Blue)三种颜色的光的组合。RGB是加色模型的一种,用于显示图像。每个像素点的颜色都是通过调整这三种颜色的光的强度来混合得到的,而光的强度是在【0-255】
例如上面那个色彩像素块,它第二行倒数第一个的色点是有红色(R)的201亮度,加绿色(G)的155亮度,加蓝色(B)的165亮度组合而成的。
对于黑白图片(称为灰度图像),是没有以上三个颜色通道的,它只有一个通道,它只需亮度即可。
我们可以看到,这些像素点就是一些矩阵。如果一张图片的宽是500,高是500,那么它每一个像素点的RGB也是500x500,一般表示为【500,500,3】,这三个数分别代表着宽,高,颜色通道。
二、图像数据的读取
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算
import numpy as np
# 使用cv2.imread()函数读取位于指定路径的图像文件
# "E:\\XUEXI\\Python_learn\\tupian\\1.jpg" 是图像文件的绝对路径
# 如果图像文件不存在或路径错误,该函数将返回None
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
# 使用cv2.imshow()函数在窗口中显示图像
# 第一个参数是窗口名称,第二个参数是要显示的图像
cv2.imshow('Image', img)
# 使用cv2.waitKey()函数等待键盘输入
# 参数0表示无限期等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
cv2.imread()函数读取位于指定路径的图像文件,并且引用图片的绝对路径需要使用 ‘\’ 进行引用
如果图像文件不存在或路径错误,该函数将返回None,可以用以下代码规范表达:
# 检查图片是否正确读取
if img is None:
print("Error: 图片未找到或路径错误。")
else:
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用cv2.imshow()函数在窗口中显示图像,cv2.imshow()的第一个参数是窗口名称,第二个参数是要显示的图像
cv2.waitKey()函数用于等待键盘输入,参数0表示无限期等待,直到用户按下任意键;如果参数不为0,则为定时显示。例如cv2.waitKey(10000)则图片显示10秒钟然后自动关闭。
cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
我们也可以通过输出img来看看它的具体组成
可以看到它也是一个矩阵,并且值的范围都在【0-255】之间。
图片的读取也可以将它写成一个函数,等使用的时候直接调用就可以了:
def cv2_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
灰色图片读取方式
加上cv2.IMREAD_GRAYSCALE
即可变成灰色图片
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg",cv2.IMREAD_GRAYSCALE)
很多情况下,我们一般都会将彩色图片先读取成灰色图片进行预处理的。就例如下面所示,颜色通道失去GBR三通道,并且图像的尺寸也减小了,更适合用于图像预处理。
图片的保存方法:
cv2.imwrite('mydog.jpg',img)
三、数据读取-视频
import cv2
import matplotlib.pyplot as plt
import numpy as np
# 使用cv2.VideoCapture()函数创建一个VideoCapture对象,用于读取视频文件
vc = cv2.VideoCapture("E:\\XUEXI\\Python_learn\\shipin\\1.mp4")
# 检查视频是否成功打开
if vc.isOpened():
# 如果成功打开,读取视频的第一帧
open, frame = vc.read()
else:
# 如果失败,设置open为False
open = False
# 使用while循环读取视频的每一帧
#while open:也就是当open = True时
while open:
# 读取下一帧
ret, frame = vc.read()
# 如果读取的帧是None,说明视频已经结束,跳出循环
if frame is None:
break
# 如果读取成功(ret为True),则进行处理
if ret == True:
# 将当前帧从BGR颜色空间转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用cv2.imshow()函数显示灰度图像
cv2.imshow("result", gray)
# 使用cv2.waitKey()函数等待80毫秒,检查是否有按键按下
# 如果按下的是ESC键(键码27),则跳出循环
if cv2.waitKey(80) & 0xFF == 27:
break
# 释放VideoCapture对象,释放视频文件
vc.release()
# 关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
cv2.VideoCapture()函数创建一个VideoCapture对象,用于读取视频文件
在OpenCV中,cv2.VideoCapture.read()方法用于从视频流或视频文件中读取帧。这个方法返回两个值:ret和frame。
ret是一个布尔值(True或False)。
如果成功读取帧,ret为True。
如果无法读取帧(例如,视频已经结束或读取过程中发生错误),ret为False。
frame是当前读取的帧的图像数据。
如果ret为True,frame包含当前帧的图像数据。
如果ret为False,frame可能为None或不包含有效数据。
运行结果是一段视频:
四、图像的其他操作
截取部分图像数据
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
cat = img[0:50,0:200]
cv2_show("cat", cat)
cat = img[0:50,0:200]
这里的意思是截取图片的宽【0-50】,长【0-200】
运行结果:
颜色通道提取
# 导入OpenCV库,用于图像处理
import cv2
# 导入matplotlib的pyplot模块,用于图像显示(虽然在这个代码中没有使用到)
import matplotlib.pyplot as plt
# 导入numpy库,用于数值计算(虽然在这个代码中没有使用到)
import numpy as np
# 定义一个函数cv2_show,用于显示图像
def cv2_show(name, img):
# 使用cv2.imshow()函数显示图像
cv2.imshow(name, img)
# 使用cv2.waitKey(0)函数等待,直到用户按下任意键
cv2.waitKey(0)
# 使用cv2.destroyAllWindows()函数关闭所有OpenCV创建的窗口
cv2.destroyAllWindows()
# 使用cv2.imread()函数读取位于指定路径的图像文件
img = cv2.imread("E:\\XUEXI\\Python_learn\\tupian\\1.jpg")
# 使用cv2.split()函数将图像的BGR通道分离
b, g, r = cv2.split(img)
# 使用cv2.merge()函数将分离的通道重新合并,用于后续操作
img = cv2.merge((b, g, r))
# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的B和G通道值设置为0,只显示R通道
cur_img[:, :, 0] = 0
cur_img[:, :, 1] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("R", cur_img)
# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的B通道值设置为0,只显示G和R通道
cur_img[:, :, 0] = 0
cur_img[:, :, 2] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("G", cur_img)
# 创建图像的副本
cur_img = img.copy()
# 将副本图像的BGR通道中的G通道值设置为0,只显示B和R通道
cur_img[:, :, 1] = 0
cur_img[:, :, 2] = 0
# 使用cv2_show函数显示修改后的图像
cv2_show("B", cur_img)
cv2.split()函数将图像的BGR通道分离
cv2.merge()函数将分离的通道重新合并,用于后续操作
cur_img[:, :, 0] = 0
cur_img[:, :, 1] = 0
cur_img:是原图像的一个副本。
[:, :, 0]:表示选择图像的所有行(:)和所有列(:),以及第一个颜色通道(0代表蓝色通道)。
[:, :, 1]:表示选择图像的所有行和所有列,以及第二个颜色通道(1代表绿色通道)。
这两行代码的作用是:
将cur_img图像的所有蓝色通道(B通道)的像素值设置为0。
将cur_img图像的所有绿色通道(G通道)的像素值设置为0。
从而达到颜色通道提取的作用。
只保留红色通道的运行结果: