目录
一、前言
编程语言:Python,编程软件:vscode或pycharm,必备的第三方库:OpenCV,numpy,matplotlib,os等等。
关于OpenCV,numpy,matplotlib,os等第三方库的下载方式如下:
第一步,按住【Windows】和【R】调出运行界面,输入【cmd】,回车打开命令行。
第二步,输入以下安装命令(可以先升级一下pip指令)。
pip升级指令:
python -m pip install --upgrade pip
opencv库的清华源下载:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
numpy库的清华源下载:
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
matplotlib库的清华源下载:
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
os库的清华源下载:
pip install os -i https://pypi.tuna.tsinghua.edu.cn/simple
二、实验目的
1.熟悉图像处理开发环境;
2.了解及完成图片读取及写出;
3.了解及完成视频数据读写及写出。
三、实验内容
1.任选一张彩色图及视频(5秒以内)完成课堂教授内容
2.使用下面公式将图片及视频转换成灰阶图,并将图及视频保存下来
Gray = (R + G + B) / 3
3.在彩色图及视频上随机地方著上(R,G,B) = (237, 28, 36)且大小为20 x 20 pixels的正方形,并将图及视频保存下来
四、实验过程
(1)本次实验的图片素材和视频素材如下:
图片命名为"img1.jpg",像素为450*450,图片样例如下所示:
视频命名为"video.mp4",像素为1280*720,视频样例如下所示:
(2)运用Gray = (R + G + B) / 3将图片和视频转化为灰阶图并保存
彩色图片转化为灰阶图并保存的代码如下所示:
python
import cv2
import numpy as np
# 图像路径
img_path = r"D:\Image\img1.jpg"
# 读取图像
img = cv2.imread(img_path)
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 创建相同大小但初始值为0的灰度图像
img_gray = np.zeros([height, width], img.dtype)
# 遍历图像的每一个像素点
for i in range(height):
for j in range(width):
# 获取像素点的RGB值
img_values = img[i, j]
# 计算RGB值的平均值并赋给灰度图像相应像素点
img_gray[i, j] = int((img_values[0] + img_values[1] + img_values[2]) / 3)
# 展示灰度图像
cv2.namedWindow("img_gray", cv2.WINDOW_AUTOSIZE)
cv2.imshow("img_gray", img_gray)
# 等待按下任意键
cv2.waitKey(0)
# 销毁所有窗口
cv2.destroyAllWindows()
# 保存灰度图像
retval = cv2.imwrite(r"D:\Image\img1_gray.jpg", img_gray)
彩色视频转化为灰阶图并保存的代码如下所示:
python
import cv2
import numpy as np
import os
# 打开视频文件
cap = cv2.VideoCapture(r"D:\Image\video.mp4")
currentframe = 0
# 循环读取视频帧并保存为图片
while (True):
ret, frame = cap.read()
if ret:
name = str(currentframe)
cv2.imwrite(r"D:\Image\video_img\%s.jpg"%name, frame)
currentframe += 1
else:
break
# 释放视频对象
cap.release()
# 打开图片文件夹
video_img_path = r"D:\Image\video_img"
# 遍历图片文件夹中的所有图片
for img_name in os.listdir(video_img_path):
img_path = video_img_path + "/" + img_name
img = cv2.imread(img_path)
height, width = img.shape[:2]
# 转换为灰度图
img_gray = np.zeros([height, width], img.dtype)
for i in range(height):
for j in range(width):
img_values = img[i, j]
img_gray[i, j] = int((img_values[0] + img_values[1] + img_values[2]) / 3)
# 保存灰度图
save_name = img_name.split(".")[0] + "_gray"
retval = cv2.imwrite(r"D:\Image\video_img_gray\%s.jpg"%save_name, img_gray)
print(f"第{save_name}张图片已保存")
print("灰阶图已保存完成")
原视频的彩色图片集如下,每一张图片的像素均为1280*720:
灰阶图的图片集如下:
将灰阶图的照片集重新制作成视频,代码如下:
python
import cv2
import os
video_img_path = r"D:\Image\video_img_gray"
# 视频尺寸
img_size = (1280, 720)
# 获取所有图片文件
img_files = os.listdir(video_img_path)
# 图片数量
img_count = len(img_files)
# 视频编码
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 保存视频的路径和名称
video_save = r"D:\Image\video_gray.mp4"
# 创建视频写入对象
video_writer = cv2.VideoWriter(video_save, fourcc, 60, img_size)
# 创建图片数组
img_array = []
for i in range(0, img_count):
# 构建每张图片的路径
img_path = video_img_path + "/" + str(i) + "_gray.jpg"
# 读取每张图片
img = cv2.imread(img_path)
# 如果图片读取失败则跳过
if img is None:
continue
img_array.append(img)
for j in range(0, img_count):
# 调整图片大小
img_array[j] = cv2.resize(img_array[j], img_size)
# 将图片写入视频
video_writer.write(img_array[j])
print(f"第{j}张图片合成完成")
print("灰度视频合成完成")
(3)在彩色图及视频上随机地方著上(R,G,B) = (237, 28, 36)且大小为20 x 20 pixels的正方形,并将图及视频保存下来。
彩色图片的随机著色代码如下:
python
import cv2
import random
# 指定图像路径
img_path = r"D:\Image\img1.jpg"
# 读取图像
img = cv2.imread(img_path)
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 随机生成一个高度和宽度
height_random = random.randint(0, height - 20)
width_random = random.randint(0, width - 20)
# 绘制矩形框
cv2.rectangle(img, (width_random, height_random), (width_random + 20, height_random + 20), (237, 28, 36), -1)
# 创建窗口显示图像
cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE)
cv2.imshow("image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
retval = cv2.imwrite(r"D:\Image\img1_color.jpg", img)
彩色图片集的随机著色代码如下:
python
import cv2
import random
import os
video_img_path = r"D:\Image\video_img"
for img_name in os.listdir(video_img_path):
img_path = video_img_path + "/" + img_name
img = cv2.imread(img_path)
# 获取图像的高度和宽度
height, width = img.shape[:2]
# 随机生成一个高度和宽度
height_random = random.randint(0, height - 20)
width_random = random.randint(0, width - 20)
# 绘制矩形框
cv2.rectangle(img, (width_random, height_random), (width_random + 20, height_random + 20), (237, 28, 36), -1)
save_name = img_name.split(".")[0] + "_color"
retval = cv2.imwrite(r"D:\Image\video_img_color\%s.jpg"%save_name, img)
print(f"第{save_name}张着色图片已保存")
print("所有图片已保存")
将随机着色后的图像集重新制作成视频,代码如下:
python
import cv2
import os
video_img_path = r"D:\Image\video_img_color"
# 图像大小
img_size = (1280, 720)
# 视频保存路径
video_save = r"D:\Image\video_color.mp4"
# 获取图像文件列表
img_files = os.listdir(video_img_path)
# 图像数量
img_count = len(img_files)
# 视频编码
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# 创建视频写入对象
video_writer = cv2.VideoWriter(video_save, fourcc, 60, img_size)
# 创建图像数组
img_array = []
for i in range(0, img_count):
# 构建图像路径
img_path = video_img_path + "/" + str(i) + "_color.jpg"
# 读取图像
img = cv2.imread(img_path)
# 如果图像为空,则跳过本次循环
if img is None:
continue
img_array.append(img)
for j in range(0, img_count):
# 调整图像大小
img_array[j] = cv2.resize(img_array[j], img_size)
# 将图像写入视频
video_writer.write(img_array[j])
print(f"第{j}张图片合成完成")
print("随机着色视频合成完成")
合成后的随机着色视频如下,与原视频时长和帧数相同:
都看到最后了,不点个赞吗?