自发辐射,受激辐射和受激吸收 2021-05-30 17:41 采纳率: 100%
浏览 305
已采纳

python如何精确保存读取到的图片像素

我尝试用opencv、PIL、matplotlib.pyplot读取图片像素,将读取到的像素矩阵保存为图片,再读取时发现像素值有出入,如何精确地保存矩阵为图片呢?

​from typing import Counter

import numpy as np

from PIL import Image

cc = Image.open('ccc.jpg') #打开同目录下的ccc.jpg图片
np.array(cc)
print(type(cc))
cc = np.array(cc)
print(type(cc))
print(cc.shape)
print(cc.dtype)
print(Counter(cc.flatten()))
cc = Image.fromarray(cc)
print(type(cc))
cc.save('cccc.jpg')

cc = Image.open('cccc.jpg')
print(type(cc))
cc = np.array(cc)
print(type(cc))
print(cc.shape)
print(cc.dtype)
print(Counter(cc.flatten()))

import matplotlib.pyplot as plt

cc = plt.imread('ccc.jpg')
print(type(cc))
print(cc.shape)
print(Counter(cc.flatten()))
plt.figure(figsize=(30,40),dpi=1)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.subplots_adjust(top=1,bottom=0,left=0,right=1,hspace =0,wspace =0)
plt.margins(0,0)
plt.imshow(cc)
plt.axis('off')
plt.savefig('cccc.jpg')

cc = plt.imread('cccc.jpg')
print(type(cc))
print(cc.shape)
print(Counter(cc.flatten()))

import cv2
cc = cv2.imread('ccc.jpg')
print(type(cc))
print(cc.shape)
print(Counter(cc.flatten()))

cv2.imwrite('cccc.jpg', cc)
cc = cv2.imread('cccc.jpg')
print(type(cc))
print(cc.shape)
print(Counter(cc.flatten()))​
  • 写回答

2条回答 默认 最新

  • CSDN专家-黄老师 2021-05-30 18:50
    关注

    你是说图片占用空间大小变了吧?因为你保存jpg图片会做压缩处理,所以图片的大小会变了。

    JPEG做了一件事,就是把这些8x8的小块进行了一个正交变换(离散余弦,DCT变换)。经过变换之后,很多元素会接近0。我们把这些比较小的数值强制设定为0,只保留少量较大的数值,那么需要存储的元素将大大减少。例如原来需要保存64个元素,现在可能只需要保存6个元素,那么文件大小就会显著下降。
    这个过程,并没有对图像的分辨率进行处理,所以不会影响图像的分辨率。

    建议参考:https://www.zhihu.com/question/25554419/answer/31917806

    希望对你有帮助,如有帮助,望采纳,谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度