You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 04:24:03