当前位置:   article > 正文

基于OpenCV的图形分析辨认02

基于OpenCV的图形分析辨认02

目录

一、前言

二、实验目的

三、实验内容

四、实验过程


一、前言

编程语言: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.根据图像缩放算法,自行撰写代码完成图像及视频数据的缩小及放大;

4.比较及分析公用函式库及自行撰写函式的效能。

三、实验内容

1.任选彩色图片、视频,进行缩小及放大

(1)使用OpenCV函数

(2)不使用OpenCV函数

  1. Nearest-Neighbor interpolation
  2. Bi-linear interpolation

2.在彩色图、视频上任意选取区域執行不同的放大方式,结果如下图

(1)使用OpenCV函数

(2)不使用OpenCV函数

  1. Nearest-Neighbor interpolation
  2. Bi-linear interpolation

四、实验过程

(1)基于OpenCV的图像和视频缩放:

图像代码如下:

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. # 读取原始图像
  4. img_origin = cv2.imread(r"D:\Image\img1.jpg")
  5. # 获取图像的高度和宽度
  6. height, width = img_origin.shape[:2]
  7. # 放大图像
  8. img_amplify = cv2.resize(img_origin, None, fx = 1.25, fy = 1.0, interpolation = cv2.INTER_AREA)
  9. # 缩小图像
  10. img_reduce = cv2.resize(img_origin, None, fx = 0.75, fy = 1.0, interpolation = cv2.INTER_AREA)
  11. # 创建一个大小为(10, 10)的图形
  12. plt.figure(figsize=(10, 10))
  13. # 在第1行第1列的位置创建子图,设置坐标轴可见,设置标题为"origin"
  14. plt.subplot(1, 3, 1), plt.axis('on'), plt.title("origin")
  15. # 显示原始图像
  16. plt.imshow(cv2.cvtColor(img_origin, cv2.COLOR_BGR2RGB))
  17. # 在第1行第2列的位置创建子图,设置坐标轴可见,设置标题为"amplify: fx = 1.25, fy = 1.0"
  18. plt.subplot(1, 3, 2), plt.axis('on'), plt.title("amplify: fx = 1.25, fy = 1.0")
  19. # 显示放大后的图像
  20. plt.imshow(cv2.cvtColor(img_amplify, cv2.COLOR_BGR2RGB))
  21. # 在第1行第3列的位置创建子图,设置坐标轴可见,设置标题为"reduce: fx = 0.75, fy = 1.0"
  22. plt.subplot(1, 3, 3), plt.axis('on'), plt.title("reduce: fx = 0.75, fy = 1.0")
  23. # 显示缩小后的图像
  24. plt.imshow(cv2.cvtColor(img_reduce, cv2.COLOR_BGR2RGB))
  25. # 调整子图布局
  26. plt.tight_layout()
  27. # 显示图形
  28. plt.show()
  29. # 保存图像
  30. retval = cv2.imwrite(r"D:\Image\image_lab2\img_amplify.jpg", img_amplify)
  31. retval = cv2.imwrite(r"D:\Image\image_lab2\img_reduce.jpg", img_reduce)

代码运行结果:

视频代码如下:

  1. import cv2
  2. import os
  3. cap = cv2.VideoCapture(r"D:\Image\video1.mp4")
  4. currentframe = 0
  5. # 循环读取视频帧并保存为图片
  6. while (True):
  7. ret, frame = cap.read()
  8. if ret:
  9. name = str(currentframe)
  10. cv2.imwrite(r"D:\Image\image_lab2\video_img\%s.jpg"%name, frame)
  11. currentframe += 1
  12. else:
  13. break
  14. # 释放视频对象
  15. cap.release()
  16. video_path = r"D:\Image\image_lab2\video_img"
  17. # 获取视频文件夹中的所有文件
  18. img_files = os.listdir(video_path)
  19. # 统计图片文件数量
  20. img_count = len(img_files)
  21. # 设定视频编解码器
  22. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  23. # 设定图片大小放大后的目标尺寸
  24. img_size_amplify = (1280, 1280)
  25. # 设定图片大小缩小后的目标尺寸
  26. img_size_reduce = (720, 720)
  27. # 视频保存路径(放大版本)
  28. video_save_amplify = r"D:\Image\image_lab2\video_amplify.mp4"
  29. # 视频保存路径(缩小版本)
  30. video_save_reduce = r"D:\Image\image_lab2\video_reduce.mp4"
  31. # 创建放大版本的视频写入对象
  32. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  33. # 创建缩小版本的视频写入对象
  34. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  35. print("视频放大及缩小开始")
  36. for i in range(0, img_count):
  37. # 设定图片文件路径
  38. img_path = video_path + "/" + str(i) + ".jpg"
  39. # 读取图片
  40. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  41. # 若读取失败则跳过本次循环
  42. if img is None:
  43. continue
  44. # 图片放大
  45. img_amplify = cv2.resize(img, img_size_amplify)
  46. # 图片缩小
  47. img_reduce = cv2.resize(img, img_size_reduce)
  48. # 将放大后的图片写入放大版本的视频
  49. video_writer_amplify.write(img_amplify)
  50. # 将缩小后的图片写入缩小版本的视频
  51. video_writer_reduce.write(img_reduce)
  52. print(f"第{i}张图片合成完成")
  53. print("视频放大及缩小完成")

基于最近邻插值和双线性插值的图像和视频缩放:

将最近邻插值和双线性插值编写成函数文件,命名为【Nearest_Bilinear】,代码如下:

  1. import numpy as np
  2. def Nearest(img, height, width, channels):
  3. # 创建一个与给定高度、宽度和通道数相同的零数组
  4. img_nearest = np.zeros(shape=(height, width, channels), dtype=np.uint8)
  5. # 遍历每个像素点
  6. for i in range(height):
  7. for j in range(width):
  8. # 计算在给定高度和宽度下对应的img的行和列
  9. row = (i / height) * img.shape[0]
  10. col = (j / width) * img.shape[1]
  11. # 取最近的整数行和列
  12. row_near = round(row)
  13. col_near = round(col)
  14. # 如果行或列到达img的边界,则向前取整
  15. if row_near == img.shape[0] or col_near == img.shape[1]:
  16. row_near -= 1
  17. col_near -= 1
  18. # 将最近的像素赋值给img_nearest
  19. img_nearest[i][j] = img[row_near][col_near]
  20. # 返回最近映射后的图像
  21. return img_nearest
  22. def Bilinear(img, height, width, channels):
  23. # 生成一个用于存储bilinear插值结果的零矩阵
  24. img_bilinear = np.zeros(shape=(height, width, channels), dtype=np.uint8)
  25. # 对矩阵的每一个元素进行插值计算
  26. for i in range(0, height):
  27. for j in range(0, width):
  28. # 计算当前元素所在的行和列的相对位置
  29. row = (i / height) * img.shape[0]
  30. col = (j / width) * img.shape[1]
  31. row_int = int(row)
  32. col_int = int(col)
  33. # 计算当前元素所在点的权重
  34. u = row - row_int
  35. v = col - col_int
  36. # 判断当前元素是否越界,若是则调整相对位置
  37. if row_int == img.shape[0] - 1 or col_int == img.shape[1] - 1:
  38. row_int -= 1
  39. col_int -= 1
  40. # 根据权重进行插值计算
  41. img_bilinear[i][j] = (1 - u) * (1 - v) * img[row_int][col_int] + (1 - u) * v * img[row_int][col_int + 1] + u * (1 - v) * img[row_int + 1][col_int] + u * v * img[row_int + 1][col_int + 1]
  42. # 返回bilinear插值结果
  43. return img_bilinear

 后续在实现图像放缩时导入该函数即可,图像放缩代码如下:

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. from Nearest_Bilinear import *
  4. # 读取图像
  5. img = cv2.imread(r"D:\Image\img1.jpg", cv2.IMREAD_COLOR)
  6. # 获取图像的高度、宽度和通道数
  7. height, width, channels = img.shape
  8. print(height, width, channels)
  9. # 对图像进行放大操作,增加200个像素的高度
  10. img_nearest_amplify = Nearest(img, height + 200, width, channels)
  11. # 对图像进行缩小操作,减少200个像素的高度
  12. img_nearest_reduce = Nearest(img, height - 200, width, channels)
  13. # 创建一个大小为10x10的图像窗口
  14. plt.figure(figsize=(10, 10))
  15. # 在第一个子图中显示原始图像
  16. plt.subplot(1, 3, 1), plt.axis('on'), plt.title("origin")
  17. plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  18. # 在第二个子图中显示放大后的图像
  19. plt.subplot(1, 3, 2), plt.axis('on'), plt.title("Nearest_amplify")
  20. plt.imshow(cv2.cvtColor(img_nearest_amplify, cv2.COLOR_BGR2RGB))
  21. # 在第三个子图中显示缩小后的图像
  22. plt.subplot(1, 3, 3), plt.axis('on'), plt.title("Nearest_reduce")
  23. plt.imshow(cv2.cvtColor(img_nearest_reduce, cv2.COLOR_BGR2RGB))
  24. plt.tight_layout()
  25. plt.show()
  26. # 对图像进行放大操作,增加200个像素的高度
  27. img_bilinear_amplify = Bilinear(img, height + 200, width, channels)
  28. # 对图像进行缩小操作,减少200个像素的高度
  29. img_bilinear_reduce = Bilinear(img, height - 200, width, channels)
  30. # 创建一个大小为10x10的图像窗口
  31. plt.figure(figsize=(10, 10))
  32. # 在第一个子图中显示原始图像
  33. plt.subplot(1, 3, 1), plt.axis('on'), plt.title("origin")
  34. plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  35. # 在第二个子图中显示放大后的图像
  36. plt.subplot(1, 3, 2), plt.axis('on'), plt.title("Bilinear_amplify")
  37. plt.imshow(cv2.cvtColor(img_bilinear_amplify, cv2.COLOR_BGR2RGB))
  38. # 在第三个子图中显示缩小后的图像
  39. plt.subplot(1, 3, 3), plt.axis('on'), plt.title("Bilinear_reduce")
  40. plt.imshow(cv2.cvtColor(img_bilinear_reduce, cv2.COLOR_BGR2RGB))
  41. plt.tight_layout()
  42. plt.show()
  43. # 保存图像
  44. retval = cv2.imwrite(r"D:\Image\image_lab2\img_nearest_amplify.jpg", img_nearest_amplify)
  45. retval = cv2.imwrite(r"D:\Image\image_lab2\img_nearest_reduce.jpg", img_nearest_reduce)
  46. retval = cv2.imwrite(r"D:\Image\image_lab2\img_bilinear_amplify.jpg", img_bilinear_amplify)
  47. retval = cv2.imwrite(r"D:\Image\image_lab2\img_bilinear_reduce.jpg", img_bilinear_reduce)

代码运行结果如下:

 基于最近邻插值的视频缩放代码:

  1. import cv2
  2. import os
  3. from Nearest_Bilinear import *
  4. video_path = r"D:\Image\image_lab2\video_img"
  5. # 获取视频文件夹中的所有文件
  6. img_files = os.listdir(video_path)
  7. # 统计图片文件数量
  8. img_count = len(img_files)
  9. # 设定视频编解码器
  10. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  11. # 设定图片大小放大后的目标尺寸
  12. img_size_amplify = (1280, 1280)
  13. # 设定图片大小缩小后的目标尺寸
  14. img_size_reduce = (720, 720)
  15. # 视频保存路径(放大版本)
  16. video_save_amplify = r"D:\Image\image_lab2\video_amplify_Nearest.mp4"
  17. # 视频保存路径(缩小版本)
  18. video_save_reduce = r"D:\Image\image_lab2\video_reduce_Nearest.mp4"
  19. # 创建放大版本的视频写入对象
  20. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  21. # 创建缩小版本的视频写入对象
  22. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  23. print("视频放大及缩小开始")
  24. for i in range(0, img_count):
  25. # 设定图片文件路径
  26. img_path = video_path + "/" + str(i) + ".jpg"
  27. # 读取图片
  28. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  29. # 若读取失败则跳过本次循环
  30. if img is None:
  31. continue
  32. # 图片放大
  33. img_amplify = Nearest(img, img_size_amplify[0], img_size_amplify[1], 3)
  34. # 图片缩小
  35. img_reduce = Nearest(img, img_size_reduce[0], img_size_reduce[1], 3)
  36. # 将放大后的图片写入放大版本的视频
  37. video_writer_amplify.write(img_amplify)
  38. # 将缩小后的图片写入缩小版本的视频
  39. video_writer_reduce.write(img_reduce)
  40. print(f"第{i}张图片合成完成")
  41. print("视频放大及缩小完成")

基于双线性插值的视频放缩代码:

  1. import cv2
  2. import os
  3. from Nearest_Bilinear import *
  4. video_path = r"D:\Image\image_lab2\video_img"
  5. # 获取视频文件夹中的所有文件
  6. img_files = os.listdir(video_path)
  7. # 统计图片文件数量
  8. img_count = len(img_files)
  9. # 设定视频编解码器
  10. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  11. # 设定图片大小放大后的目标尺寸
  12. img_size_amplify = (1280, 1280)
  13. # 设定图片大小缩小后的目标尺寸
  14. img_size_reduce = (720, 720)
  15. # 视频保存路径(放大版本)
  16. video_save_amplify = r"D:\Image\image_lab2\video_amplify_Bilinear.mp4"
  17. # 视频保存路径(缩小版本)
  18. video_save_reduce = r"D:\Image\image_lab2\video_reduce_Bilinear.mp4"
  19. # 创建放大版本的视频写入对象
  20. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  21. # 创建缩小版本的视频写入对象
  22. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  23. print("视频放大及缩小开始")
  24. for i in range(0, img_count):
  25. # 设定图片文件路径
  26. img_path = video_path + "/" + str(i) + ".jpg"
  27. # 读取图片
  28. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  29. # 若读取失败则跳过本次循环
  30. if img is None:
  31. continue
  32. # 图片放大
  33. img_amplify = Bilinear(img, img_size_amplify[0], img_size_amplify[1], 3)
  34. # 图片缩小
  35. img_reduce = Bilinear(img, img_size_reduce[0], img_size_reduce[1], 3)
  36. # 将放大后的图片写入放大版本的视频
  37. video_writer_amplify.write(img_amplify)
  38. # 将缩小后的图片写入缩小版本的视频
  39. video_writer_reduce.write(img_reduce)
  40. print(f"第{i}张图片合成完成")
  41. print("视频放大及缩小完成")

(2)基于OpenCV的局部图像和视频缩放

局部图像的缩放代码如下:

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. # 读取原始图像
  4. img_origin = cv2.imread(r"D:\Image\img1.jpg", cv2.IMREAD_COLOR)
  5. # 获取图像的高度和宽度
  6. height, width = img_origin.shape[:2]
  7. # 定义图像的一部分的坐标范围
  8. y1, y2 = 100, 300
  9. x1, x2 = 100, 300
  10. # 获取图像的一部分
  11. img_part = img_origin[y1:y2, x1:x2]
  12. # 放大图像
  13. img_amplify = cv2.resize(img_part, None, fx=1.25, fy=1.0, interpolation=cv2.INTER_NEAREST)
  14. # 缩小图像
  15. img_reduce = cv2.resize(img_part, None, fx=0.75, fy=1.0, interpolation=cv2.INTER_LINEAR)
  16. # 创建绘图窗口
  17. plt.figure(figsize=(10, 10))
  18. # 绘制图像
  19. plt.subplot(2, 2, 1), plt.axis('on'), plt.title("origin")
  20. plt.imshow(cv2.cvtColor(img_origin, cv2.COLOR_BGR2RGB))
  21. plt.subplot(2, 2, 2), plt.axis('on'), plt.title("part")
  22. plt.imshow(cv2.cvtColor(img_part, cv2.COLOR_BGR2RGB))
  23. plt.subplot(2, 2, 3), plt.axis('on'), plt.title("amplify: fx = 1.25, fy = 1.0")
  24. plt.imshow(cv2.cvtColor(img_amplify, cv2.COLOR_BGR2RGB))
  25. plt.subplot(2, 2, 4), plt.axis('on'), plt.title("reduce: fx = 0.75, fy = 1.0")
  26. plt.imshow(cv2.cvtColor(img_reduce, cv2.COLOR_BGR2RGB))
  27. # 调整子图布局
  28. plt.tight_layout()
  29. # 显示图形
  30. plt.show()
  31. # 保存图像
  32. retval = cv2.imwrite(r"D:\Image\image_lab2\img_part.jpg", img_part)
  33. retval = cv2.imwrite(r"D:\Image\image_lab2\img_amplify_part.jpg", img_amplify)
  34. retval = cv2.imwrite(r"D:\Image\image_lab2\img_reduce_part.jpg", img_reduce)

局部视频的缩放代码如下:

  1. import cv2
  2. import os
  3. video_path = r"D:\Image\image_lab2\video_img"
  4. # 获取视频文件夹中的所有文件
  5. img_files = os.listdir(video_path)
  6. # 统计图片文件数量
  7. img_count = len(img_files)
  8. # 设定视频编解码器
  9. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  10. # 设定图片大小放大后的目标尺寸
  11. img_size_amplify = (720, 720)
  12. # 设定图片大小缩小后的目标尺寸
  13. img_size_reduce = (250, 250)
  14. # 视频保存路径(放大版本)
  15. video_save_amplify = r"D:\Image\image_lab2\video_amplify_part.mp4"
  16. # 视频保存路径(缩小版本)
  17. video_save_reduce = r"D:\Image\image_lab2\video_reduce_part.mp4"
  18. # 创建放大版本的视频写入对象
  19. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  20. # 创建缩小版本的视频写入对象
  21. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  22. print("视频放大及缩小开始")
  23. for i in range(0, img_count):
  24. # 设定图片文件路径
  25. img_path = video_path + "/" + str(i) + ".jpg"
  26. # 读取图片
  27. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  28. img = img[100:500, 100:500]
  29. # 若读取失败则跳过本次循环
  30. if img is None:
  31. continue
  32. # 图片放大
  33. img_amplify = cv2.resize(img, img_size_amplify)
  34. # 图片缩小
  35. img_reduce = cv2.resize(img, img_size_reduce)
  36. # 将放大后的图片写入放大版本的视频
  37. video_writer_amplify.write(img_amplify)
  38. # 将缩小后的图片写入缩小版本的视频
  39. video_writer_reduce.write(img_reduce)
  40. print(f"第{i}张图片合成完成")
  41. print("视频放大及缩小完成")

基于最近邻插值和双线性插值的局部图像和视频缩放:

局部图像的缩放代码如下:

  1. import cv2
  2. import matplotlib.pyplot as plt
  3. from Nearest_Bilinear import *
  4. # 读取图像
  5. img = cv2.imread(r"D:\Image\img1.jpg", cv2.IMREAD_COLOR)
  6. # 获取图像的高度、宽度和通道数
  7. height, width, channels = img.shape
  8. # 定义图像的一部分的坐标范围
  9. y1, y2 = 100, 300
  10. x1, x2 = 100, 300
  11. # 获取图像的一部分
  12. img_part = img[y1:y2, x1:x2]
  13. # 对图像进行放大操作,增加100个像素的高度
  14. img_nearest_amplify_part = Nearest(img_part, height + 100, width, channels)
  15. # 对图像进行缩小操作,减少100个像素的高度
  16. img_nearest_reduce_part = Nearest(img_part, height - 100, width, channels)
  17. # 创建一个大小为10x10的图像窗口
  18. plt.figure(figsize=(10, 10))
  19. # 在第一个子图中显示原始图像
  20. plt.subplot(1, 3, 1), plt.axis('on'), plt.title("origin")
  21. plt.imshow(cv2.cvtColor(img_part, cv2.COLOR_BGR2RGB))
  22. # 在第二个子图中显示放大后的图像
  23. plt.subplot(1, 3, 2), plt.axis('on'), plt.title("Nearest_amplify")
  24. plt.imshow(cv2.cvtColor(img_nearest_amplify_part, cv2.COLOR_BGR2RGB))
  25. # 在第三个子图中显示缩小后的图像
  26. plt.subplot(1, 3, 3), plt.axis('on'), plt.title("Nearest_reduce")
  27. plt.imshow(cv2.cvtColor(img_nearest_reduce_part, cv2.COLOR_BGR2RGB))
  28. plt.tight_layout()
  29. plt.show()
  30. # 对图像进行放大操作,增加100个像素的高度
  31. img_bilinear_amplify_part = Bilinear(img_part, height + 100, width, channels)
  32. # 对图像进行缩小操作,减少100个像素的高度
  33. img_bilinear_reduce_part = Bilinear(img_part, height - 100, width, channels)
  34. # 创建一个大小为10x10的图像窗口
  35. plt.figure(figsize=(10, 10))
  36. # 在第一个子图中显示原始图像
  37. plt.subplot(1, 3, 1), plt.axis('on'), plt.title("origin")
  38. plt.imshow(cv2.cvtColor(img_part, cv2.COLOR_BGR2RGB))
  39. # 在第二个子图中显示放大后的图像
  40. plt.subplot(1, 3, 2), plt.axis('on'), plt.title("Bilinear_amplify")
  41. plt.imshow(cv2.cvtColor(img_bilinear_amplify_part, cv2.COLOR_BGR2RGB))
  42. # 在第三个子图中显示缩小后的图像
  43. plt.subplot(1, 3, 3), plt.axis('on'), plt.title("Bilinear_reduce")
  44. plt.imshow(cv2.cvtColor(img_bilinear_reduce_part, cv2.COLOR_BGR2RGB))
  45. plt.tight_layout()
  46. plt.show()
  47. # 保存图像
  48. retval = cv2.imwrite(r"D:\Image\image_lab2\img_nearest_amplify_part.jpg", img_nearest_amplify_part)
  49. retval = cv2.imwrite(r"D:\Image\image_lab2\img_nearest_reduce_part.jpg", img_nearest_reduce_part)
  50. retval = cv2.imwrite(r"D:\Image\image_lab2\img_bilinear_amplify_part.jpg", img_bilinear_amplify_part)
  51. retval = cv2.imwrite(r"D:\Image\image_lab2\img_bilinear_reduce_part.jpg", img_bilinear_reduce_part)

基于最近邻插值的局部视频缩放代码:

  1. import cv2
  2. import os
  3. from Nearest_Bilinear import *
  4. video_path = r"D:\Image\image_lab2\video_img"
  5. # 获取视频文件夹中的所有文件
  6. img_files = os.listdir(video_path)
  7. # 统计图片文件数量
  8. img_count = len(img_files)
  9. # 设定视频编解码器
  10. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  11. # 设定图片大小放大后的目标尺寸
  12. img_size_amplify = (720, 720)
  13. # 设定图片大小缩小后的目标尺寸
  14. img_size_reduce = (250, 250)
  15. # 视频保存路径(放大版本)
  16. video_save_amplify = r"D:\Image\image_lab2\video_amplify_Nearest_part.mp4"
  17. # 视频保存路径(缩小版本)
  18. video_save_reduce = r"D:\Image\image_lab2\video_reduce_Nearest_part.mp4"
  19. # 创建放大版本的视频写入对象
  20. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  21. # 创建缩小版本的视频写入对象
  22. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  23. print("视频放大及缩小开始")
  24. for i in range(0, img_count):
  25. # 设定图片文件路径
  26. img_path = video_path + "/" + str(i) + ".jpg"
  27. # 读取图片
  28. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  29. img = img[100:500, 100:500]
  30. # 若读取失败则跳过本次循环
  31. if img is None:
  32. continue
  33. # 图片放大
  34. img_amplify = Nearest(img, img_size_amplify[0], img_size_amplify[1], 3)
  35. # 图片缩小
  36. img_reduce = Nearest(img, img_size_reduce[0], img_size_reduce[1], 3)
  37. # 将放大后的图片写入放大版本的视频
  38. video_writer_amplify.write(img_amplify)
  39. # 将缩小后的图片写入缩小版本的视频
  40. video_writer_reduce.write(img_reduce)
  41. print(f"第{i}张图片合成完成")
  42. print("视频放大及缩小完成")

基于双线性插值的局部视频缩放代码如下:

  1. import cv2
  2. import os
  3. from Nearest_Bilinear import *
  4. video_path = r"D:\Image\image_lab2\video_img"
  5. # 获取视频文件夹中的所有文件
  6. img_files = os.listdir(video_path)
  7. # 统计图片文件数量
  8. img_count = len(img_files)
  9. # 设定视频编解码器
  10. fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  11. # 设定图片大小放大后的目标尺寸
  12. img_size_amplify = (720, 720)
  13. # 设定图片大小缩小后的目标尺寸
  14. img_size_reduce = (250, 250)
  15. # 视频保存路径(放大版本)
  16. video_save_amplify = r"D:\Image\image_lab2\video_amplify_Bilinear_part.mp4"
  17. # 视频保存路径(缩小版本)
  18. video_save_reduce = r"D:\Image\image_lab2\video_reduce_Bilinear_part.mp4"
  19. # 创建放大版本的视频写入对象
  20. video_writer_amplify = cv2.VideoWriter(video_save_amplify, fourcc, 60, img_size_amplify)
  21. # 创建缩小版本的视频写入对象
  22. video_writer_reduce = cv2.VideoWriter(video_save_reduce, fourcc, 60, img_size_reduce)
  23. print("视频放大及缩小开始")
  24. for i in range(0, img_count):
  25. # 设定图片文件路径
  26. img_path = video_path + "/" + str(i) + ".jpg"
  27. # 读取图片
  28. img = cv2.imread(img_path, cv2.IMREAD_COLOR)
  29. img = img[100:500, 100:500]
  30. # 若读取失败则跳过本次循环
  31. if img is None:
  32. continue
  33. # 图片放大
  34. img_amplify = Bilinear(img, img_size_amplify[0], img_size_amplify[1], 3)
  35. # 图片缩小
  36. img_reduce = Bilinear(img, img_size_reduce[0], img_size_reduce[1], 3)
  37. # 将放大后的图片写入放大版本的视频
  38. video_writer_amplify.write(img_amplify)
  39. # 将缩小后的图片写入缩小版本的视频
  40. video_writer_reduce.write(img_reduce)
  41. print(f"第{i}张图片合成完成")
  42. print("视频放大及缩小完成")

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/205343
推荐阅读
相关标签
  

闽ICP备14008679号