基于OpenCV的图形分析辨认01

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言: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("随机着色视频合成完成")

合成后的随机着色视频如下,与原视频时长和帧数相同:

都看到最后了,不点个赞吗?

相关推荐
乔宕一3 分钟前
在 vscode + cmake + GNU 工具链的基础上配置 JLINK
vscode·gnu·jlink
小兜全糖(xdqt)34 分钟前
python中单例模式
开发语言·python·单例模式
Python数据分析与机器学习43 分钟前
python高级加密算法AES对信息进行加密和解密
开发语言·python
noravinsc1 小时前
python md5加密
前端·javascript·python
唯余木叶下弦声1 小时前
PySpark之金融数据分析(Spark RDD、SQL练习题)
大数据·python·sql·数据分析·spark·pyspark
程序媛徐师姐1 小时前
Python基于Django的社区爱心养老管理系统设计与实现【附源码】
python·django·社区爱心养老·社区爱心养老管理系统·python社区养老管理系统·社区养老·社区养老管理系统
叫我:松哥2 小时前
基于Python django的音乐用户偏好分析及可视化系统设计与实现
人工智能·后端·python·mysql·数据分析·django
Le0v1n2 小时前
VSCode注释高亮(# NOTE;# TODO;# FIXME;#XXX;# HACK;# BUG)
ide·vscode·python
cafehaus2 小时前
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
前端·vue.js·vscode
冰万森3 小时前
【图像处理】——掩码
python·opencv·计算机视觉