从输出 jpeg 图像中检索像素值

信息处理 matlab JPEG
2022-02-03 02:40:09

我有这个 jpeg 图像(abc.jpg),我更改了这个图像的一些像素值并将其存储在硬盘上,以便稍后查看更改后的像素值。输出 jpeg 图像的名称是 xyz.jpg。这里的问题在于图像 xyz.jpg。改变的像素并没有给我我改变它们的确切值。

例子:

在 abc.jpg 中,像素位置 (x,y)=(1,10) 的像素值为 (231, 120, 120)。现在,我想将其更改为 (230, 120, 120)。现在,我将此输出图像保存为 xyz.jpg。当我尝试从位置 (1,10) 检索值时,我得到的像素值为 (232, 120, 120)。现在您看到了问题,我无法获得已更改的值。我在 MATLAB 中做这一切。是的,我尝试将输出图像保存为 .tiff、.bmp、.gif。但是与 .jpg 相比,这些格式的大小非常大。请提出一些解决这个问题的方法。

3个回答

问问自己:为什么您认为 TIFF 和 BMP 文件很大,而 JPEG 文件很小?

答:JPEG 是一种有损压缩格式,通过从图像中去除人眼无法察觉的细节来实现较小的文件大小。根据设计,JPEG 不能保证解压缩后的图像与压缩后的图像逐个像素相同——它只是保留了人眼可以感知的整体内容。您可以尝试增加质量参数,但这可能无法解决您的问题。亮度级别仍将被量化,颜色信息将被下采样。

一些“解决方案”:

  • 不要使用JPEG,使用无损压缩格式。
  • 直接在压缩域中进行图像编辑/修改。我怀疑 Matlab 中是否有工具可以做到这一点,并且压缩域图像修改不像写入像素数组那么简单!

JPEG 是一种有损格式,这意味着在压缩和解压缩之间会添加噪声。因此,一般来说,您无法获得无噪声的结果(与整个图像中的像素相同)。

但是,对于单个像素,您可以通过抖动单个感兴趣像素周围的区域来强制获得所需的值。您可以通过反复试验在感兴趣的像素周围尝试许多随机低级噪声模式(它可能涉及整个宏块),并查看其中一个随机模式是否将结果向所需方向移动了所需的量,或者可能遗传算法可以收敛于适当的抖动模式。

上述工作是否有效可能取决于 JPEG 压缩器配置的量化或压缩级别。

我认为 JPG 格式的文件是最丰富的图像文件之一。当您更改 PNG 格式文件中的像素值时,该像素的值正在发生更改,但问题是当您尝试对 jpg 文件执行相同操作时,它不会这样做。通过做一个简单的实验你会更好地知道。

MSpaint的图像在前 50 行涂上红色,在接下来的 50 行涂上绿色,从第 100 到第 150 行涂上蓝色,最后 50 行涂上一半白色和一半黑色。比如 (1,150) 到 (50,175) 白色和 (51,175) 到 (100,200) 黑色。然后将此文件保存为 jpg 格式。然后打开保存的图像。你会在颜色的边缘注意到一些非常有趣的东西。你会得到你的答案。150100