You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:将LSB隐写图像转视频后出现数据丢失问题

解决LSB隐写视频后数据丢失的方案

你遇到的问题确实是视频编码压缩在搞鬼——大多数视频格式哪怕是AVI,默认都会用有损压缩算法,这些算法会修改像素的最低有效位(也就是你藏数据的核心位置),自然就把你的秘密信息弄丢了。下面是几个针对性的解决办法:

1. 改用无损视频编码格式

这是最核心的解决步骤,必须选择完全不修改像素值的无损编码来写入视频。推荐两种兼容性较好的选项:

  • FFV1:开源无损编码,生成的视频体积适中,兼容性不错
  • RAW:原始像素格式,完全无压缩,但视频体积会非常大

修改你的写入代码示例:

第一种方式优化:

import cv2

video_name = 'video_lossless.avi'
# 指定FFV1无损编码
fourcc = cv2.VideoWriter_fourcc(*'FFV1')
# 帧率、尺寸必须和你处理后的帧严格匹配(这里假设原帧率是30)
video = cv2.VideoWriter(video_name, fourcc, 30, (width, height))
# 直接写入嵌入数据后的帧数组,别先存成图片再读(中间存JPG会有压缩损失)
for stego_frame in stego_frames:
    video.write(stego_frame)
video.release()

第二种方式优化:

import cv2

outvid = 'video_lossless.avi'
# 替换为FFV1无损编码
fourcc = cv2.VideoWriter_fourcc(*'FFV1')
vid = None
fps = 5  # 必须和原视频/处理帧的帧率完全一致
size = None
is_color = True

# 直接遍历处理后的隐写帧数组,避免从文件夹读图片的中间损失
for stego_frame in stego_frames:
    if vid is None:
        size = stego_frame.shape[1], stego_frame.shape[0]
        vid = cv2.VideoWriter(outvid, fourcc, float(fps), size, is_color)
    # 禁止缩放帧(缩放会强制修改像素值),确保尺寸完全匹配
    if size[0] != stego_frame.shape[1] or size[1] != stego_frame.shape[0]:
        raise ValueError("帧尺寸不匹配,请确保处理后的帧和原视频尺寸一致!")
    vid.write(stego_frame)
vid.release()

2. 砍掉中间环节的像素损失

你之前的代码里是从文件夹读取图片写入视频,如果这些图片是用JPG等有损格式保存的,哪怕视频用了无损编码,中间的图片保存已经把LSB数据弄丢了。所以:

  • 处理完隐写的帧后,直接写入视频,不要先保存为图片文件
  • 如果必须保存中间帧,一定要用PNG这种无损图片格式

3. 验证视频保存的像素一致性

写完视频后,可以快速验证一帧,确认像素没有被修改:

import cv2
import numpy as np

# 读取刚写入的视频
cap = cv2.VideoCapture('video_lossless.avi')
ret, read_frame = cap.read()
cap.release()

# 和原隐写帧对比
if np.array_equal(read_frame, stego_frames[0]):
    print("像素完全一致,无损保存成功!")
else:
    print("仍有像素损失,请检查编码格式或参数是否正确")

按照这个思路调整后,视频保存过程就不会碰你的LSB数据了,提取时就能正常恢复嵌入的文本。

内容的提问来源于stack exchange,提问作者amin khoramian

火山引擎 最新活动