Imageio.imwrite 没有保存正确的值

Imageio.imwrite does not save the correct values

谁能解释一下为什么保存图像后 rgb 值会出现这种不一致的情况。

import imageio as io

image = 'img.jpg'
type = image.split('.')[-1]
output = 'output' + type

img = io.imread(image)

print(img[0][0][1]) # 204

img[0][0][1] = 255

print(img[0][0][1]) # 255

io.imwrite(output, img, type, quality = 100)

imgTest = io.imread(output)

print(imgTest[0][0][1]) # 223

# io.help('jpg')

使用的图片 = img.jpg

imageio中有定义的进程

imageio读取的是一个RGB结构,如果你想把它保存到opencv中,你需要把这个RGB转换成BGR。此外,如果您在 matplotlib 中绘图,它会相应变化。

最好的方法是,

  1. 读取imageio中的图片
  2. 将 RGB 转换为 BGR
  3. 保存在opencv中写入

加载 jpeg 图像然后再次将其保存为 jpeg 时像素发生变化的原因是 jpeg 使用有损压缩。为了节省 jpeg 图像的存储空间 space,像素值以降维表示形式保存。您可以找到有关特定算法的一些信息here。 有损压缩的优点是可以显着减小图像尺寸,而人眼不会注意到任何变化。但是,如果没有任何额外的方法,我们将不会在将原始图像保存为 jpg 格式后检索它。

另一种不使用有损压缩的替代方法是 png 格式,我们可以通过将您的示例图像转换为 png 并再次运行代码来验证它:

import imageio as io
import numpy as np
import matplotlib.pyplot as plt

image = '/content/drive/My Drive/img.png'
type = image.split('.')[-1]
output = 'output' + type

img = io.imread(image)

print(img[0][0][1]) # 204

img[0][0][1] = 255

print(img[0][0][1]) # 255

io.imwrite(output, img, type)

imgTest = io.imread(output)

print(imgTest[0][0][1]) # 223

# io.help('jpg')

输出:

204
255
255

我们还可以看到 png 图片比 jpg 图片占用更多的存储空间 space

import os
os.path.getsize('img.png')
# output: 688444
os.path.getsize('img.jpg')
# output: 69621

这是 png 图片: