【问题标题】:How to save jpeg data that is identical to the original jpeg file using OpenCV如何使用 OpenCV 保存与原始 jpeg 文件相同的 jpeg 数据
【发布时间】:2015-07-17 11:42:51
【问题描述】:

我正在使用 OpenCV 和 Python。我已将 jpeg 图像加载到 numpy 数组中。现在我想把它保存回jpeg格式,但是由于图像没有被修改,我不想再次压缩它。是否可以从 numpy 数组创建一个与加载它的 jpeg 相同的 jpeg?

我知道这个工作流程(解码-编码而不做任何事情)听起来有点愚蠢,但保留原始 jpeg 数据不是一种选择。如果可以仅使用手头的数据重新创建原始 jpeg,我很感兴趣。

问题与Reading a .JPG Image and Saving it without file size change不同,因为我没有修改图片中的任何内容。我真的很想根据手头的数据恢复原始的jpeg文件。我假设可以绕过压缩步骤(压缩工件已经在数据中),只需以 jpeg 格式写入文件。问题是,OpenCV 是否可以做到这一点。

【问题讨论】:

  • 不,不是。我添加了一段,解释了原因。
  • 是的,我认为它是.. 你是否改变一个值是不相关的。另一个问题的答案包含您需要的确切信息:例如:“没有一般的方法可以知道原始质量设置是什么。”这意味着编码和重新编码会改变文件。
  • 我不这么认为。一个例子。如果我有 未修改 jpeg 数据,我可以将数据写回 jpeg 而无需实际的压缩步骤。更具体地说,没有下采样部分 (en.wikipedia.org/wiki/JPEG#Encoding),因为图像已经正确下采样,您可以通过仔细查看图像的一个颜色通道来看到。如果我修改图像中的任何像素,则必须再次对图像进行下采样以保持 jpeg 约束。
  • 如果您有 未修改的 jpeg 数据,您不能完全绕过 opencv 并将原始字节写入文件吗?

标签: python opencv numpy jpeg


【解决方案1】:

澄清答案,以下评论:

你说的完全没有道理;您说您拥有未经修改的原始 RGB 数据。不,你没有。您拥有从 压缩 jpeg 文件重建未压缩数据。

JPEG 标准指定如何解压缩图像/视频。标准中没有关于如何实际进行这种压缩的任何内容,因此您的原始图像数据可能已经以无数种不同的方式进行压缩。您无法知道重新创建数据所需的解码步骤,因此您无法反转它们。

图像这个。

“我有一个号码,44,请告诉我如何才能得到原件 这是来自的数字”

这基本上就是你要问的。

你可以做你想做的事(除了复制原始文件)的唯一方法是在加载到openCV之前将图像读入一个数组。然后,如果您想保存它,只需将原始数组写入文件,如下所示:

fi = 'C:\\Path\\to\\Image.jpg'
fo = 'C:\\Path\\to\\Copy_Image.jpg'
with open(fi,'rb') as myfile:
    im_array = np.array(myfile.read())

# Do stuff here

image = cv2.imdecode(im_array)

# Do more stuff here

with open(fo,'wb') as myfile:
    myfile.write(im_array)

当然,这意味着您将在内存中有效地存储两次数据,但在我看来这是您唯一的选择。

有时候,无论你多么想做一件事,你都必须接受它就是做不到。

【讨论】:

  • 正如我在原帖中所说:存储原始 jpeg 数据不是选项。这里的任务是在给定 jpeg 图像的 RGB 数据的情况下重现相同的 jpeg。
猜你喜欢
  • 2019-01-30
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2012-09-16
  • 2012-02-28
  • 2010-11-07
  • 2013-04-29
  • 2016-07-03
相关资源
最近更新 更多