对图像进行Jpeg压缩进行模拟
2014-09-16 15:00
295 查看
开发环境:VS2010+Opencv2.4.6 对Lena.bmp图像进行压缩
#include <iostream> #include <opencv2\opencv.hpp> #include <math.h> using namespace std; using namespace cv; int round(double c){ return int(c+0.5*(c<0?-1:1)); } int main() { IplImage *lena=cvLoadImage("lena.bmp"); IplImage *grayImage=cvCreateImage(cvSize(lena->width,lena->height),lena->depth,1); IplImage *resultImage=cvCreateImage(cvSize(lena->width,lena->height),lena->depth,1); cvCvtColor(lena,grayImage,CV_BGR2GRAY); CvMat *grayMat=cvCreateMat(grayImage->height,grayImage->width,CV_64FC1); CvMat *temp=cvCreateMat(grayImage->height,grayImage->width,CV_64FC1); CvMat *grayDctMat=cvCreateMat(grayImage->height,grayImage->width,CV_64FC1); CvMat *quantizationMat=cvCreateMat(grayImage->height,grayImage->width,CV_64FC1); cvScale(grayImage,grayMat); //每个像素减去128 for(int i=0;i<grayMat->rows;i++) { for (int j=0;j<grayMat->cols;j++) { double a=cvmGet(grayMat,i,j); double b=a-128; cvmSet(temp,i,j,b); } } //DCT变换 cvDCT(temp,grayDctMat,CV_DXT_FORWARD); /* for(int i=0;i<8;i++) { for (int j=0;j<8;j++) { cout<<grayMat->data.db[i*grayMat->rows+j]<<" "; } cout<<endl; } cout<<"---------------------------------------------"<<endl; */ //量化矩阵 double quantizationData[]={16,11,10,16,24,40,51,61,12,12,14,19,26,58,60,55,14,13,16,24,40,57,69,56,14,17,22,29,51,87,80,62,18,22,37,56,68,109, 103,77,24,35,55,64,81,104,113,92,49,64,78,87,103,121,120,101,72,92,95,98,112,100,103,99}; CvMat quantizationMatrix=cvMat(8,8,CV_64FC1,quantizationData); //量化过程 for (int i=0;i<32;i++){ for (int j=0;j<32;j++){ for(int m=0;m<8;m++){ for (int n=0;n<8;n++) { //量化 double a=cvGetReal2D(grayDctMat,i*8+m,j*8+n); double b=cvGetReal2D(&quantizationMatrix,m,n); int c=round(a/b); //反量化 int d=int(b*c); cvmSet(quantizationMat,i*8+m,j*8+n,d); } } } } //逆DCT变换 cvDCT(quantizationMat,temp,CV_DXT_INVERSE); for(int i=0;i<temp->rows;i++) { for (int j=0;j<temp->cols;j++) { double a=cvmGet(temp,i,j); double b=round(a)+128; cvmSet(temp,i,j,b); } } cvScale(grayMat,resultImage); //计算均方误差 double MSE=0; double square=0; double PSNR=0; for(int i=0;i<grayMat->rows;i++) { for (int j=0;j<grayMat->cols;j++) { double a=cvmGet(grayMat,i,j); double b=cvmGet(temp,i,j);; double c=a-b; // cout<<c<<endl; square+=c*c; } } square/=256; square/=256; MSE=sqrt(square); PSNR=10*log10(255*255/MSE); // cout<<"square:"<<square<<endl; cout<<"MSE:"<<MSE<<endl; cout<<"PSNR:"<<PSNR<<endl; /* for(int i=0;i<8;i++) { for (int j=0;j<8;j++) { cout<<grayMat->data.db[i*grayMat->rows+j]<<" "; } cout<<endl; }*/ /* for(int i=0;i<quantizationMatrix.rows;i++) { for (int j=0;j<quantizationMatrix.cols;j++) { cout<<quantizationMatrix.data.db[i*quantizationMatrix.rows+j]<<" "; } cout<<endl; }*/ /* for (int i=0;i<20;i++) { for (int j=0;j<8;j++) { cout<<grayMat->data.db[i*grayMat->rows+j]<<" "; } cout<<endl; for (int j=0;j<8;j++) { cout<<grayDctMat->data.db[i*grayDctMat->rows+j]<<" "; } cout<<endl; }*/ cvNamedWindow("gray"); cvShowImage("gray",grayImage); cvNamedWindow("jpeg"); cvShowImage("jpeg",resultImage); cvWaitKey(0); cvDestroyWindow("gray"); cvDestroyWindow("jpeg"); cvReleaseImage(&grayImage); cvReleaseImage(&lena); getchar(); return 0; }
相关文章推荐
- linux libjpeg对图像进行压缩
- 利用IJG JPEG Library压缩图像为jpg格式
- java合成jpeg图像 压缩问题 resize问题
- 用DCMTK解压jpeg压缩图像
- jpeg图像的压缩编码与解码
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- gdi+不能读取jpeg压缩的tiff图像,有什么好的解决办法吗?
- JPEG图像压缩算法流程详解
- 网络摄像机—图像压缩方式—JPEG、MJPEG
- JPEG图像压缩算法流程详解
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- JPEG-2000静止图像压缩标准(翻译自Adams的经典文章)
- 使用libjpeg处理图像(libjpeg的使用压缩与解压缩jpg格式)
- 【转】利用IJG JPEG Library压缩图像为jpg格式
- 从多个输入图像文件进行编码(JPEG, PNG, TGA等)
- 利用IJG JPEG Library压缩图像为jpg格式
- VB6结合GDI+实现内存(Stream)压缩/解压缩JPG(JPEG)图像
- JPEG 图像压缩
- JPEG图像压缩算法流程详解
- 使用libjpeg对图像进行压缩