图像加载和保存
上次我们测试了搭建的开发环境,现在我们详细讲一下,怎么读取图片并显示出来以及图片的保存和摄像头的调用
1.什么是图像
计算机“看到”的图像其实是一个一个像素点构成的,每个像素点都有对应的数值。 所以图像时结构化存储的数据信息。
- 图像属性:
- 通道数目:一般的RGB图片,通道数目(channels) 是3个(红、绿、蓝);而monochrome图片,通道数目(channels)是1。
- 高与宽:顾名思义,高度是图像竖向的长度, 宽度是图像横向的长度
- 像素数据:就是图像每个像素点的值
- 图像类型:图像在计算机显示的类型有二值图像、灰度图像、彩色图像(伪彩色图像和真彩色图像)
2.获取图像的详细信息
下面通过代码来获取图像的详细信息,包括图像的形状、类型、大小、数据类型和像素值。
下面是获取图像信息的函数:
def get_image_info(image):
print("图像的类型:", type(image))
print("图像的形状:", image.shape)
print("图像的大小:", image.size)
print("图像的数据类型:", image.dtype)
pixel_data = np.array(image)
print("图像的像素值:", pixel_data)
完整代码:
import cv2 as cv
import numpy as np
def get_image_info(image):
print("图像的类型:", type(image))
print("图像的形状:", image.shape)
print("图像的大小:", image.size)
print("图像的数据类型:", image.dtype)
pixel_data = np.array(image)
print("图像的像素值:", pixel_data)
print("----------hello python----------")
src = cv.imread("E:/image.jpg") # 读取图像,注意使用自己图像的路径
get_image_info(src) # 获取传入图像的详细信息
cv.waitKey(0) # 等待键盘输入,目的是让程序停在这里不马上关闭
cv.destroyAllWindows() # 销毁该程序下的所有窗口
从运行的结果可以看出,这个图像的类型是numpy.ndarray,这是python中numpy库里面的多维数组, 图像形状是(613, 573, 3),说明图像的高度是613,宽度是573,通道数是3。图像的大小是1053747,这个数据是由之前的图像形状计算而来,6135733=1053747,由1053747个像素组成。图像的数据是uint8格式的,每个像素点所占的大小是无符号8位的。图像的像素值在图中可以看到是有许多0到255之间的数构成的三维数组。
3.获取摄像头的画面
摄像头代码:
def video_demo():
capture = cv.VideoCapture(0) # 打开摄像头设备,参数为0表示使用第一个设备,如果有多个设备可以修改参数,选择使用的设备
while True:
ret, frame = capture.read() # ret表示返回的信息,frame表示视频中的每一帧
frame = cv.flip(frame, 1)
"""
翻转 0:沿X轴翻转(垂直翻转)
大于0:沿Y轴翻转(水平翻转)
小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
如果不加这一句代码,摄像头显示的画面是相反的,可以试一试效果
"""
cv.imshow("video", frame) # 使用一个窗口来显示摄像头的内容
c = cv.waitKey(50) # 等待50毫秒
if c == 27: # 27对应ASCII中的ESC,如果键盘输入ESC键,则会退出整个循环
break
完整代码:
import cv2 as cv
import numpy as np
def video_demo():
capture = cv.VideoCapture(0) # 打开摄像头设备,参数为0表示使用第一个设备,如果有多个设备可以修改参数,选择使用的设备
while True:
ret, frame = capture.read() # ret表示返回的信息,frame表示视频中的每一帧
frame = cv.flip(frame, 1)
"""
翻转 0:沿X轴翻转(垂直翻转)
大于0:沿Y轴翻转(水平翻转)
小于0:先沿X轴翻转,再沿Y轴翻转,等价于旋转180°
如果不加这一句代码,摄像头显示的画面是相反的,可以试一试效果
"""
cv.imshow("video", frame) # 使用一个窗口来显示摄像头的内容
c = cv.waitKey(50) # 等待50毫秒
if c == 27: # 27对应ASCII中的ESC,如果键盘输入ESC键,则会退出整个循环
break
print("----------hello python----------")
video_demo()
cv.waitKey(0)
cv.destroyAllWindows()
测试结果:
可以按ESC键之后,按0键结束程序,或者直接点击pycharm中的红色停止按钮停止程序。
4.将读取的图片转换为灰色图片并保存图片
保存图片的操作很简单,只需几行代码
print("----------hello python----------")
src = cv.imread("E:/image.jpg")
cv.imshow("input image", src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY) # 转化为灰色
cv.imwrite("E:/image1.jpg", gray) # 保存图片
cv.waitKey(0)
cv.destroyAllWindows()