opencv+webp

WebP是一种新兴的图片格式,提供有损和无损压缩,比PNG小26%,比JPEG小25-34%。其工作原理包括预测编码和无损压缩。Google Chrome等浏览器原生支持WebP,且有许多工具和库用于转换和处理WebP图片。尽管编码时间较长,但WebP在减少图片大小和提高网页加载速度方面展现出明显优势。

WebP,互联网一个新的图片格式

WebP是一个新的图片格式,它为在互联网上的图片提供了有损和无损压缩。WebP的无损图片比PNG的图片的大小小26%(研究结果)。在同等的SSIM(SSIM wiki)指数下,WebP的有损图片比用JPEG的图片大小小25-34%(研究结论)。WebP仅需要22%额外的字节(研究结果)就能支持无损透明度(alpha通道)。

网站管理员和Web开发者可以使用WebP图片格式来创建更小的和更丰富的图片来让你的web更快。

WebP是如何工作的?

WebP的有损压缩使用了预测编码(介绍)来编码图片,该方法也同样用于VP8视频编解码器压缩视频的关键帧。预测编码使用在相邻的块的像素值来预测一个块中的值,然后只编码的实际值和预测之间的差(剩余)。

这个差值通常包含很多0值,而这写可以更有效的被压缩。然后将差值通过通常的变换、量化、熵编码。WebP还采用了大小可变的块。

WebP的无损压缩用已经看到的图片帧来准确的重新构造新像素,如果发现没有很好的匹配,则使用一个本地的调色板,这个调色板不断更新,以重新使用最新的颜色。这种压缩模式被命名为“VP8L”,与所谓的LZ77()压缩算法拥有一些共同的特点。

一个WebP文件是包括VP8或者VP8L的图片数据,是给予RIFF的容器。libwebp库是一个参考WEBP规范实现的,并在此git仓库和一个压缩包

WebP支持

很多种工具支持WebP,另外,Google Chrome原生支持它,Google Chrome Frame插件用来在IE,Opera 11.10和Android冰淇淋三明治上支持WebP。

开发者还支持各种图片编辑工具。此版本还提供了轻量级的编码和解码库,libwebp和命令行工具cwebpdwebp可以将图片和webp格式之间相互转换。完整的源代码在下载页上。

webp简介

WebP (发音”weppy”),由google 2010年发布。是一种同时提供了有损压缩与无损压缩的图片文件格式,派生自图像编码格式VP8 。 是由Google购买On2Technologies后发展出来的格式,以BSD授权条款发布。

目前PC浏览器只有Chrome兼容webp,但移动设备都有兼容webp的方案。

 

webp优缺点

相比JPEG,这种格式可以把图片大小减少40%,而且前整个互联网的流量中有65%为图片。这意味如果Google让这种格式得到普及的话,你浏览网页的速度将大幅提升。

美中不足的是,WebP格式图像的编码时间“比JPEG格式图像长8倍”。

 

案例 

淘宝App大图jpg和webpp格式对比:

jpg图片:87.6k      http://gw2.alicdn.com/bao/uploaded/i2/T1sIPTFB8bXXXXXXXX_!!0-item_pic.jpg

webp图片:17.6k     http://gw2.alicdn.com/bao/uploaded/i2/T1sIPTFB8bXXXXXXXX_!!0-item_pic.jpg_640x640q90.jpg_.webp

 

参考资料 

Google developers webp官方文档 <https://developers.google.com/speed/webp/>

百度百科-webp <http://baike.baidu.com/view/4447461.htm?fr=aladdin>

wikipedia-webp <http://en.wikipedia.org/wiki/WebP>  

Google推出新的图片格式WebP,挑战JPEG,让互联网更快 <http://www.36kr.com/p/4963.html>

BSD协议 <http://baike.baidu.com/link?url=N6pg0Y8Nn_hWf_91GI-ZYCGKpj7dJOcSC5IP5S86xHje4bKJ0485lD9TtEKieCbNc-ydqakXm_GsJZMVyR5uEq>

谷歌WebP图像格式评测:压缩率显著提升 <http://www.youkuaiyun.com/article/2010-10-11/280355>

webp 浏览器兼容大全 <http://caniuse.com/webp/>

webp for Android <http://stackoverflow.com/questions/7032695/webp-for-android>

支持Android4.0以下webp的使用 <http://blog.youkuaiyun.com/jiwangkailai02/article/details/17015451>

webp <http://blog.youkuaiyun.com/shichaosong/article/details/8752828>

ios如何使用webp  <http://blog.youkuaiyun.com/huanghuanghbc/article/details/19840557>

WebP iOS 示例应用 <http://webm.greatdreamers.cn/blog/2011/09/sample-webp-ios-app/>

实时压缩项目文档 <http://wiki.corpautohome.com/pages/viewpage.action?pageId=28743320/>

 WebP转换器下载

Linux,Windows或Mac OS X下载预编译cwebp的转换工具,转换PNG和JPEG为WebP。


#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#include <webp/encode.h>
#include <webp/decode.h>

static const int CV_IMWRITE_WEBP_QUALITY = 64;

using namespace std;
using namespace cv;

struct webp_t{
	size_t quality;
	bool lossless;
};

bool write(const Mat& img, webp_t webp);



int main(int argc, char *argv[])
{
    std::string inf = "d:\\images.jpg";
    IplImage* source= cvLoadImage(inf.c_str(),1);
	IplImage * dst = NULL;
	dst = cvCreateImage(cvSize(800,600), source->depth, source->nChannels);    //构造目标图象	
	cvResize(source, dst, CV_INTER_AREA);                         //缩放源图像到目标图像
	Mat img = cv::cvarrToMat(dst, true);
	
	cvReleaseImage(&dst);
	cvReleaseImage(&source);

	int params1[3] = {0};
	params1[0] = CV_IMWRITE_JPEG_QUALITY; //jpeg质量参数
	params1[1] = 87; //质量参数

	cv::vector<u_char> buf;
	cv::imencode(".jpg", img, buf, std::vector<int>(params1, params1+2));

	Mat show = imdecode(Mat(buf),CV_LOAD_IMAGE_COLOR);



	
	webp_t webp;
	webp.lossless=false;
	webp.quality=80;

    write(show,webp);
   
    //cvReleaseImage(&img);
}



bool write(const Mat& img, webp_t webp)
{
    int channels = img.channels(), depth = img.depth();
    int width = img.cols, height = img.rows;

    const Mat *image = &img;
    Mat temp;
    size_t size = 0;

	bool comp_lossless = webp.lossless;

    int params[3] = {0};
	params[0] = CV_IMWRITE_WEBP_QUALITY; //jpeg质量参数
	params[1] = webp.quality; //质量参数

    uint8_t *out = NULL;

    if(depth != CV_8U)
    {
        return false;
    }

    if(channels == 1)
    {
        cvtColor(*image, temp, CV_GRAY2BGR);
        image = &temp;
        channels = 3;
    }
    else if (channels == 2)
    {
        return false;
    }

    if (comp_lossless)
    {
        if(channels == 3)
        {
            size = WebPEncodeLosslessBGR(image->data, width, height, (int)image->step, &out);
        }
        else if(channels == 4)
        {
            size = WebPEncodeLosslessBGRA(image->data, width, height, (int)image->step, &out);
        }
    }
    else
    {
        if(channels == 3)
        {
            size = WebPEncodeBGR(image->data, width, height, (int)image->step, webp.quality, &out);
        }
        else if(channels == 4)
        {
            size = WebPEncodeBGRA(image->data, width, height, (int)image->step, webp.quality, &out);
        }
    }
	
    if(size > 0)
    {
     
            FILE *fd = fopen("dis.webp", "wb");
            if(fd != NULL)
            {
                fwrite(out, size, sizeof(uint8_t), fd);
                fclose(fd); fd = NULL;
            }
       
    }

    if (out != NULL)
    {
        free(out);
        out = NULL;
    }

    return size > 0;
}


OpenCV 支持处理 WebP 图像格式,这得益于其广泛的图像格式兼容性。WebP 是由 Google 开发的一种现代图像格式,支持有损和无损压缩,能够在保持高质量的同时显著减小文件体积,非常适合用于图像传输和存储优化。 在 OpenCV 中,读取和写入 WebP 图像的操作与处理其他图像格式(如 PNG 或 JPEG)类似,主要通过 `cv2.imread()` 和 `cv2.imwrite()` 函数实现。需要注意的是,OpenCV 中的图像处理本质上是基于 `Mat` 数据结构进行的,所有图像在内存中都会被转换为 `Mat` 格式进行操作,而 WebP 格式仅在图像加载和保存时作为输入/输出格式存在[^3]。 ### 读取 WebP 图像 使用 `cv2.imread()` 函数可以读取 WebP 图像,并将其转换为 OpenCV 可操作的 `Mat` 对象。OpenCV 会自动识别图像的颜色空间,例如 BGR 或灰度图像。 ```python import cv2 # 读取 WebP 图像 image = cv2.imread('image.webp') # 显示图像 cv2.imshow('WebP Image', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ### 保存为 WebP 格式 使用 `cv2.imwrite()` 函数可以将处理后的图像保存为 WebP 格式。可以通过传递压缩参数来控制输出质量。例如,在保存无损 WebP 图像时,可以设置压缩标志。 ```python # 保存为无损 WebP 格式 cv2.imwrite('output.webp', image, [cv2.IMWRITE_WEBP_QUALITY, 100]) ``` 其中,`cv2.IMWRITE_WEBP_QUALITY` 参数用于指定 WebP 的压缩质量,取值范围为 0 到 100,100 表示无损压缩[^2]。 ### 图像格式转换 在处理 WebP 图像时,可能需要将其转换为其他格式(如 PNG 或 JPEG),或从其他格式转换为 WebPOpenCV 允许在图像加载或保存时进行颜色空间的自动转换,例如从 BGR 转换为灰度图。 ```python # 转换为灰度图像 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 保存为灰度 WebP 图像 cv2.imwrite('gray_output.webp', gray_image, [cv2.IMWRITE_WEBP_QUALITY, 100]) ``` ### 优势与应用场景 WebP 格式相比传统图像格式(如 PNG 和 JPEG)具有更高的压缩效率,尤其在无损压缩方面表现突出。这使得它在图像传输、网页优化以及大规模图像存储等场景中非常适用[^1]。OpenCVWebP 的良好支持使得开发者可以在图像处理流程中灵活使用该格式,既保证图像质量,又降低存储和带宽需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值