1.发现问题
在处理数据集的时候,发现有几张图片分辨率不一样,于是使用cv2.resize将分辨率8192 × 2649的几张图片拉到8192 × 3000,结果文件大小从1.5MB变到3.9MB,翻了一倍多,就感觉哪里好像有点问题。
|
|
|
|
for image in files:
img = cv2.imread(os.path.join(path, image))
resize = cv2.resize(img, (8192, 3000), interpolation=cv2.INTER_LINEAR)
dstPath = join(dstpath, image)
cv2.imwrite(dstPath, resize)
在这篇文章中也有类似情况https://blog.csdn.net/weixin_52135595/article/details/124258403#comments_25393526分辨率降低,文件大小反而增加了。
2.查找资料
查找相关resize资料:https://blog.csdn.net/weixin_41466575/article/details/113058802
resize(InputArray src, OutputArray dst, Size dsize,
double fx=0, double fy=0, int interpolation=INTER_LINEAR )
更换interpolation(插值)方式后,文件大小依然很大。
换个思路从cv2.imwrite又查到了这篇文章https://blog.csdn.net/weixin_41819299/article/details/123503001 PYTHON中基于OPENCV进行图像压缩。
cv2.imwrite(new_im_path,img, [cv2.IMWRITE_JPEG_QUALITY, quality])
3.问题解决
cv2.imwrite还有第三个参数,通过IMWRITE_JPEG_QUALITY可以修改保存的图片质量,quality范围为0-100,越大图像质量越高,越小越压缩,不同图像的quality衰减情况不同,默认是95,于是我将quality设为50,成功输出1MB的图片,这样就与数据集其它图片大小差不多了。
img = cv2.imread(os.path.join(path, image))
resize = cv2.resize(img, (8192, 3000), interpolation=cv2.INTER_LINEAR)
dstPath = join(dstpath, image)
cv2.imwrite(dstPath, resize, [cv2.IMWRITE_JPEG_QUALITY, 50])
4.其它方式
使用PIL库也可以,文件大小差不多是按比例增加,在本文中的图片上从1.5MB变到1.6MB,具体实现方式可以参考这篇文章https://blog.csdn.net/weixin_40163266/article/details/115314453。