毕业设计
本文不适用 auto-export-mode, 因为 auto-export 会自动执行所有的代码。
介绍
本库用于放置有关本人西安交通大学毕业设计相关的内容。
规划 [1/2]
- 管理需要的包
- 完成使用 canny 进行边缘检测而后进行图像压缩的对比测试代码
开始
先确保我们处在正确的虚拟环境里:
which python
包管理
需要使用 cv2.
uv add opencv-python
边缘检测 - 图像
import cv2
import os
# 读取图像
image = cv2.imread('./imgs/test.png', cv2.IMREAD_GRAYSCALE)
# 使用Canny算法提取边缘
edges = cv2.Canny(image, 100, 200) # 调整阈值以适应你的图像
# 保存边缘图像
cv2.imwrite('./imgs/edges_image.png', edges)
# 压缩边缘图像
cv2.imwrite('./imgs/compressed_edges.png', edges, [cv2.IMWRITE_JPEG_QUALITY, 50]) # 调整压缩质量
# 直接压缩原图像
cv2.imwrite('./imgs/compressed_original.png', image, [cv2.IMWRITE_JPEG_QUALITY, 50]) # 调整压缩质量
# 获取文件大小
edges_size = os.path.getsize('./imgs/compressed_edges.png')
original_size = os.path.getsize('./imgs/compressed_original.png')
# 输出结果
print(f"压缩后的边缘图像大小: {edges_size} 字节")
print(f"压缩后的原图像大小: {original_size} 字节")
print(f"Canny边缘提取对压缩的帮助: {original_size - edges_size} 字节")
边缘检测 - 视频
检查 OpenCV 是否支持 H.264
如果有以下内容就代表支持。
Video I/O:
FFMPEG: YES
avcodec: YES (58.134.100)
avformat: YES (58.76.100)
avutil: YES (56.70.100)
swscale: YES (5.9.100)
import cv2
print(cv2.getBuildInformation())
import cv2
import os
# 读取视频文件
cap = cv2.VideoCapture('./videos/test.MOV')
if not cap.isOpened():
print("无法打开视频文件")
exit()
# 获取视频参数
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建视频写入对象(使用MJPG编码和JPEG压缩参数)
fourcc = cv2.VideoWriter_fourcc(*'avc1')
jpeg_params = [cv2.IMWRITE_JPEG_QUALITY, 50]
# 创建输出视频的写入器(边缘视频和压缩原视频)
out_edges = cv2.VideoWriter('./videos/edges_video.avi', fourcc, fps, (width, height))
out_original = cv2.VideoWriter('./videos/compressed_original.avi', fourcc, fps, (width, height))
# 设置视频写入器的压缩参数(OpenCV 4.5.5+支持)
out_edges.set(cv2.VIDEOWRITER_PROP_QUALITY, 50)
out_original.set(cv2.VIDEOWRITER_PROP_QUALITY, 50)
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 将帧转换为灰度图像
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 边缘检测
edges = cv2.Canny(gray_frame, 100, 200)
# 将单通道边缘图像转换为三通道
edges_bgr = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
# 将灰度原图转换为三通道
gray_bgr = cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR)
# 写入处理后的帧
out_edges.write(edges_bgr)
out_original.write(gray_bgr)
# 释放资源
cap.release()
out_edges.release()
out_original.release()
# 获取文件大小
video_size = os.path.getsize('./videos/test.MOV')
edges_size = os.path.getsize('./videos/edges_video.avi')
original_size = os.path.getsize('./videos/compressed_original.avi')
# 输出结果
print(f"原始视频的大小:{video_size} 字节")
print(f"压缩后的边缘视频大小: {edges_size} 字节")
print(f"压缩后的原视频大小: {original_size} 字节")
print(f"Canny边缘提取对压缩的帮助: {original_size - edges_size} 字节")