python 实现图像的无损压缩

方法1、利用opencv

 

import cv2
img=cv2.imread("G:/1.jpg",1)
cv2.imwrite("G:/11.jpg",img,[cv2.IMWRITE_JPEG_QUALITY,50])


[cv2.IMWRITE_JPEG_QUAITY,50] 指定图像保存时的品质,降低品质可以实现图像的压缩。

其中,50是可以改变的,取值为[0,100]

0时图像可以得到极大地压缩,但是图像的品质会被大大降低。

jpg是有损压缩,png是无损压缩

jpg不能改变透明度

import cv2
img=cv2.imread("G:/1.jpg",1)
cv2.imwrite("G:/11.png",img,[cv2.IMWRITE_PNG_COMPRESSION,0])


[cv2.IMWRITE_PNG_COMPRESSION,0]是调整PNG图像的压缩比。

为0时,压缩比最小,图像的品质最好。它的压缩范围为[0,9]

 

方法2、使用PIL进行图像压缩

在使用Pillow中的Image.save()方法,使用默认参数保存jpg图片的过程中发现图片被压缩的很严重,导致原来很大的大小变成几十K。这是因为在保存为jpg的过程中,内部使用压缩算法对图片进行的压缩处理。

但是有些时候往往需要图片的大小不能变化太大或不能太小。所以在使用此方式时可以加入参数:

imObj.save(img_name, quality=95)
quality参数: 保存图像的质量,值的范围从1(最差)到95(最佳)。 默认值为75,使用中应尽量避免高于95的值; 100会禁用部分JPEG压缩算法,并导致大文件图像质量几乎没有任何增益。

使用此参数后,图片大小会增加。如果图片的大小还不能满足你的需求,是否还有其他方式去增加图片大小呢?

通过查阅资料并尝试,发现save方法还有一个可以配合quality使用的参数,能够大大增加图片大小:

imObj.save(new_name, quality=95, subsampling=0)
subsampling参数:子采样,通过实现色度信息的分辨率低于亮度信息来对图像进行编码的实践。 (参考:https://en.wikipedia.org/wiki/Chroma_subsampling)
可能的子采样值是0,1和2,对应于4:4:4,4:2:2和4:1:1(或4:2:0?)。

经过实践将值设为0便可以满足图片大小增大的需求。

注意: 以上方法的参数只针对于保存为JPG/JPEG格式的图片的情况

img2 = Image.open(path)
img2.save(r'E:\project_data\face_fusion\test\test54.jpg', quality=quality, subsampling=0, dpi=(300.0, 300.0))

参考文档:https://pillow.readthedocs.io/en/5.1.x/handbook/image-file-formats.html#jpeg

参考文档:https://pillow.readthedocs.io/en/4.0.x/PIL.html

参考文档:https://blog.csdn.net/weixin_40874586/article/details/81367661

参考文档:https://blog.csdn.net/weixin_40976261/article/details/88808902

 

你可能感兴趣的:(#,数字图像处理)