我原本是不想要起这么一个标题党的标题。但是很不幸,我的实验结果是:webp在一些情况下并不好,甚至不如JPEG
事情的起因是这样的:某位自称拥有钛合金狗眼的同学表示他看webp觉得颜色过度特别僵硬,觉得webp会丢失颜色。我凭借着很多年与天斗与地斗与人斗的经验表示,这不可能,因为webp的变换和JPEG的变换基本没有差别,都是先转换颜色空间,然后离散余弦变换变换到频域,之后编码。由于WebP使用了压缩编码器,所以WebP的结果应该更好。于是我就随手写了这些脚本
run.sh
1 2 3 4 5 6 7 8 9 | rm -rf out mkdir out cp src.tiff out/ ./towebp.sh ./tojpg.sh ./tobmp.sh rm -f out/src.tiff convert src.tiff src.png cwebp src.tiff -lossless -alpha_cleanup -o src.webp |
tojpg.sh
1 2 3 4 5 6 7 | cd out for((i=0;i<101;i++)); do convert -quality $i src.tiff out_$i.jpg > /dev/null & done wait cd .. |
towebp.sh
1 2 3 4 5 6 7 | cd out for((i=0;i<101;i++)); do cwebp -q $i src.tiff -o out_$i.webp >/dev/null & done wait cd .. |
因为我要统计信噪比所以我需要吧webp格式再转换成无损的格式,我就选择了bmp格式
1 | find ./out -name "out_*.webp"| parallel convert {} {}.bmp > /dev/null |
下面就来正文了,我们要统计信息的信噪比了。于是我写了一段简单的MATLAB脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | src = imread('src.tiff'); src = src(:,:,1:3); size_jpg = zeros(1,101); size_webp = zeros(1,101); snr_jpg = zeros(1,101); snr_webp = zeros(1,101); for i=1:100 path_jpg = ['./out/out_' num2str(i) '.jpg']; path_webp = ['./out/out_' num2str(i) '.webp.bmp']; path_webp_src = ['./out/out_' num2str(i) '.webp']; jpg = imread(path_jpg); webp = imread(path_webp); info_jpg = dir(path_jpg); info_webp = dir(path_webp_src); size_jpg(i+1) = info_jpg.bytes; size_webp(i+1) = info_webp.bytes; snr_jpg(i+1) = psnr(jpg,src); snr_webp(i+1) = psnr(webp,src); end %% figure figure; hold on; title('Size(byte)-SNR'); plot(size_jpg,snr_jpg); plot(size_webp,snr_webp); legend('jpg','webp'); grid on; hold off; figure; hold on; title('Compress Level(%)-SNR'); plot(snr_jpg(2:end)); plot(snr_webp(2:end)); legend('jpg','webp'); grid on; hold off; |
嗯,代码都放到这里了,只要准备一张测试用的tiff格式的图片就可以开始测试了。由于进行了大量的转码,这个测试相当的耗费硬盘CPU。这里做了比较多的并行优化,笔记本的话还是别跑了。
今天已经很晚了,测试结果明天更新,到时候就会知道为什么有的时候WebP不如JPEG了