Python视频处理:实现视频二值去噪、像素化效果及帧像素矩阵提取
实现方案
依赖工具
仅需安装opencv-python和numpy两个Python库即可完成全部需求,无需额外工具。
处理逻辑
- 二值化+噪点消除:逐帧读取视频后先转灰度图,用阈值分割将画面转为纯黑纯白两色,再通过形态学开运算(先腐蚀后膨胀)消除孤立的白色小噪点,不会影响运动物体的主体轮廓
- 像素化效果:按需求设置像素块大小,将画面先缩小对应倍数再用最近邻插值放大回原尺寸,即可得到规整的像素颗粒效果
- 矩阵存储:把二值化后的255(白色)转为1、0(黑色)保留,每帧对应一个二维矩阵,全部帧的矩阵可存储为三维数组,方便后续数学计算
可运行代码
import cv2 import numpy as np # 可自行调整的参数配置 INPUT_VIDEO_PATH = "你的输入视频路径.mp4" # 二值化阈值,设为None则使用OTSU自动计算阈值 THRESHOLD = None # 噪点消除卷积核大小,数值越大去噪强度越高,建议不超过5 MORPH_KERNEL_SIZE = 2 # 像素化块大小,数值越大像素颗粒感越强 PIXEL_BLOCK_SIZE = 8 # 初始化运算核 morph_kernel = np.ones((MORPH_KERNEL_SIZE, MORPH_KERNEL_SIZE), np.uint8) # 读取原视频 cap = cv2.VideoCapture(INPUT_VIDEO_PATH) frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 计算像素化后的画面尺寸 new_w = frame_width // PIXEL_BLOCK_SIZE new_h = frame_height // PIXEL_BLOCK_SIZE # 初始化存储全量帧的三维矩阵,维度为(帧数, 像素化后高度, 像素化后宽度) all_frame_matrix = np.zeros((frame_count, new_h, new_w), dtype=np.uint8) frame_idx = 0 while cap.isOpened(): ret, frame = cap.read() if not ret: break # 转灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 二值化处理 if THRESHOLD is None: _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) else: _, binary = cv2.threshold(gray, THRESHOLD, 255, cv2.THRESH_BINARY) # 消除白色噪点 denoised = cv2.morphologyEx(binary, cv2.MORPH_OPEN, morph_kernel) # 生成像素化效果 small_frame = cv2.resize(denoised, (new_w, new_h), interpolation=cv2.INTER_NEAREST) pixelated_frame = cv2.resize(small_frame, (frame_width, frame_height), interpolation=cv2.INTER_NEAREST) # 转换为0-1矩阵存入总数组 all_frame_matrix[frame_idx] = (small_frame // 255).astype(np.uint8) # 可选:实时预览处理效果,按q键退出预览 cv2.imshow('processed_result', pixelated_frame) if cv2.waitKey(1) & 0xFF == ord('q'): break frame_idx += 1 cap.release() cv2.destroyAllWindows() # 保存全量矩阵为npy格式,后续可直接用np.load读取用于计算 np.save("all_frame_matrix.npy", all_frame_matrix) # 按要求格式输出前2帧示例 print_frames_num = 2 for i in range(print_frames_num): print(f"frame {i+1}. (0 for black pixel values, 1 for white pixel values)") for row in all_frame_matrix[i]: print(''.join(map(str, row))) print()
参数调整说明
- 自动二值化效果不符合预期时,可手动设置
THRESHOLD参数(取值范围0-255),根据实际画面亮度调整 - 残留噪点较多时可将
MORPH_KERNEL_SIZE调整为3,不要设置过大避免吞掉运动物体的边缘细节 - 像素颗粒大小可通过
PIXEL_BLOCK_SIZE调整,数值越大颗粒越粗
内容的提问来源于stack exchange,提问作者Enzo
相关产品推荐
相关产品推荐

