OpenCV图像编解码实战:JPEG与PNG压缩详解
创作时间:
作者:
@小白创作中心
OpenCV图像编解码实战:JPEG与PNG压缩详解
引用
CSDN
1.
https://blog.csdn.net/chengkun183/article/details/37580751
本文是一篇关于使用OpenCV进行JPEG和PNG图像编解码的教程文章,使用的是OpenCV 2.4.8版本。虽然当前OpenCV已经更新到4.x系列,但本文的代码和原理仍然具有参考价值。读者在实际使用时需要注意API的变化。
代码示例
源码来自:https://code.google.com/p/opencvjp-sample/source/browse/trunk/cpp/encode_decode_test.cpp?r=63
描述:描述读取一张图片进行jpg和png压缩,并解压显示。
主要函数:imencode和imdecode。
环境:windows7+vs2010+opencv2.4.8。
工程地址:http://download.csdn.net/detail/chengkun183/7609491
// JPEGDecodeEncode.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cv.h>
#include <highgui.h>
using namespace std;
using namespace cv;
double getPSNR(Mat& src1, Mat& src2, int bb=0);
int main(int argc, char** argv)
{
Mat src = imread("lena.png");
cout<<"origin image size: "<<src.dataend-src.datastart<<endl;
cout<<"height: "<<src.rows<<endl<<"width: "<<src.cols<<endl<<"depth: "<<src.channels()<<endl;
cout<<"height*width*depth: "<<src.rows*src.cols*src.channels()<<endl<<endl;
//(1) jpeg compression
vector<uchar> buff;//buffer for coding
vector<int> param = vector<int>(2);
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=95;//default(95) 0-100
imencode(".jpg",src,buff,param);
cout<<"coded file size(jpg): "<<buff.size()<<endl;//fit buff size automatically.
Mat jpegimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
//(2) png compression
param[0]=CV_IMWRITE_PNG_COMPRESSION;
param[1]=3;//default(3) 0-9.
imencode(".png",src,buff,param);
cout<<"coded file size(png): "<<buff.size()<<endl;
Mat pngimage = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
//(3) intaractive jpeg compression
char name[64];
namedWindow("jpg");
int q=95;
createTrackbar("quality","jpg",&q,100);
int key = 0;
while(key!='q')
{
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=q;
imencode(".jpg",src,buff,param);
Mat show = imdecode(Mat(buff),CV_LOAD_IMAGE_COLOR);
double psnr = getPSNR(src,show);//get PSNR
double bpp = 8.0*buff.size()/(show.size().area());//bit/pixe;
sprintf(name,"quality:%03d, %.1fdB, %.2fbpp",q,psnr,bpp);
putText(show,name,Point(15,50), FONT_HERSHEY_SIMPLEX,1,CV_RGB(255,255,255),2);
imshow("jpg",show);
key = waitKey(33);
if(key =='s')
{
//(4) data writing
sprintf(name,"q%03d_%.2fbpp.png",q,bpp);
imwrite(name,show);
sprintf(name,"q%03d_%.2fbpp.jpg",q,bpp);
param[0]=CV_IMWRITE_JPEG_QUALITY;
param[1]=q;
imwrite(name,src,param);;
}
}
}
double getPSNR(Mat& src1, Mat& src2, int bb)
{
int i,j;
double sse,mse,psnr;
sse = 0.0;
Mat s1,s2;
cvtColor(src1,s1,CV_BGR2GRAY);
cvtColor(src2,s2,CV_BGR2GRAY);
int count=0;
for(j=bb;j<s1.rows-bb;j++)
{
uchar* d=s1.ptr(j);
uchar* s=s2.ptr(j);
for(i=bb;i<s1.cols-bb;i++)
{
sse += ((d[i] - s[i])*(d[i] - s[i]));
count++;
}
}
if(sse == 0.0 || count==0)
{
return 0;
}
else
{
mse =sse /(double)(count);
psnr = 10.0*log10((255*255)/mse);
return psnr;
}
}
使用的图片为lena.png:
输出的信息:
热门推荐
曼谷摄影指南:9处绝美取景地详解
从皇居到迪士尼:东京十大旅游地标全攻略
曼谷摄影攻略:从繁华唐人街到隐秘佛寺的9处绝美景点
威海-恩施自驾攻略:1715公里双峡谷奇观之旅
威海至恩施清江画廊自驾攻略:1700公里穿越三省
威海至恩施自驾全攻略:1800公里横跨平原到高原
胃复春治胃炎,摩罗丹治萎缩性胃炎,两种胃药如何选
危楼三个月变新楼 桦皮厂胡同8号楼“装配”居民幸福感
儿童拳击教学指南:从基础训练到心理素质培养
北京中轴线:7.8公里串起14处文化遗产

贯穿紫禁城天安门,北京中轴线申遗获国际认可
发票的种类有哪些
高油高盐烹饪土豆或增脑出血风险,专家建议改用蒸煮
油炸土豆片含大量反式脂肪,医生提醒:增加心血管疾病风险
降准降息来袭,股市迎利好风暴
腹泻食疗首选山药粥:健脾止泻,营养易消化
中医调理慢性腹泻:从理论到三个食疗方案的实践指南
腹泻食疗指南:从苹果到藕粉的8种止泻食物
尤文夺冠功臣达尼洛高光时刻回顾
意甲补赛:亚特兰大主场迎战尤文图斯,谁能笑到最后?
虎眼石:属虎男的开运神器
翡翠十二生肖饰品:传统文化与现代审美的完美融合
人均GDP全国第一背后:无锡的产业优势与人口隐忧
慢性腹泻的科学治疗:从饮食调整到药物治疗的完整指南
小米粥治腹泻:传统食疗的现代科学解读
铁皮石斛助肠胃修复,科学证实多糖含量是关键
GPA与学生的学习压力之间的关系
《率土之滨》新手攻略:高效开荒技巧全解析
率土之滨S1新手开荒完全指南
《率土之滨》新手速成攻略:从零到大佬