python - Imageio.imwrite 不保存正确的值
问题描述
有人可以解释为什么我在保存图像后会在 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
解决方案
加载 jpeg 图像然后再次将其保存为 jpeg 时更改像素的原因是 jpeg 使用有损压缩。为了节省 jpeg 图像的存储空间,像素值以降维表示形式保存。您可以在此处找到有关特定算法的一些信息。有损压缩的优点是可以显着减小图像大小,而人眼不会注意到任何变化。但是,如果没有任何额外的方法,我们将无法将原始图像保存为 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图片占用的存储空间多很多
import os
os.path.getsize('img.png')
# output: 688444
os.path.getsize('img.jpg')
# output: 69621
推荐阅读
- pandas - TypeError:Series.name 必须是可散列类型
- python - 无法为链接提供href,错误:“找不到'foo'的反向”
- html - 将 unicode 放入 CSS 内容是否合法?
- spring - 在没有@RequestParam 名称的控制器中获取文件
- ruby-on-rails - 与图像的多态关联
- c++ - 如何使用被覆盖函数中的子类引用覆盖纯虚函数
- python - 在 SNMP 代理端动态增加 OID
- swift - 如何快速隐藏状态栏?
- python - “tensorflow/core/platform/posix/subprocess.cc:208] 无法启动 fork() 子进程:无法分配内存”
- javascript - 在javascript中将函数转换为类-“this”和私有函数的问题