图片压缩 dct 变换
#include <iostream>
#include <cmath>
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "opencv/cxcore.h"
#define cvCvtPlaneToPix cvMerge
using std::cout;
using std::endl;
double PSNR_B = 0;
double PSNR_G = 0;
double PSNR_R = 0;
double PSNR;
int main( int argc, char** argv )
{
IplImage *src;
CvScalar SrcPixel;
CvScalar DstPixel;
double sumB = 0;
double sumG = 0;
double sumR = 0;
double mseB;
double mseG;
double mseR;
char* filename = argc >= 2 ? argv[1] : (char*)
"d:\\肌肉.jpg";
src= cvLoadImage( filename,1 ) ;
if( !src )
{
printf("can't open the image...\n");
return -1;
}
// YUV颜色空间
IplImage* YUVImage = cvCreateImage(cvSize(src->width,src->height), src->depth, 3);
IplImage* dst = cvCreateImage(cvSize(src->width,src->height), src->depth, 3);
// YUV颜色空间各通道
IplImage* Y = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 1);
IplImage* U = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 1);
IplImage* V = cvCreateImage(cvSize(src->width,src->height), IPL_DEPTH_8U, 1);
//cvNamedWindow( "Origin Image", CV_WINDOW_AUTOSIZE );
cvCvtColor(src, YUVImage, CV_BGR2YUV); //BGR→YUV
cvSplit( YUVImage, Y, U, V, NULL);//分割通道
CvMat* MatY = cvCreateMat(Y->height,Y->width,CV_64FC1);
CvMat* MatU = cvCreateMat(V->height,U->width,CV_64FC1);
CvMat* MatV = cvCreateMat(V->height,V->width,CV_64FC1);
CvMat* DCTY = cvCreateMat(Y->height, Y->width,CV_64FC1);
CvMat* DCTU = cvCreateMat(U->height, U->width,CV_64FC1);
CvMat* DCTV = cvCreateMat(V->height, V->width,CV_64FC1);
cvScale( Y, MatY );
cvScale( U, MatU );
cvScale( V, MatV );
cvDCT(MatY, DCTY, CV_DXT_FORWARD); //余弦变换
cvDCT(MatU, DCTU, CV_DXT_FORWARD); //余弦变换
cvDCT(MatV, DCTV, CV_DXT_FORWARD); //余弦变换
//Y 通道压缩
for(int i = 0; i < Y->height; i++)
{
for(int j = 0; j < Y->width; j++)
{
double element = CV_MAT_ELEM( *DCTY, double, i, j );
if ( abs(element) < 10 )
CV_MAT_ELEM( *DCTY, double, i, j ) = 0;
}
}
// U 通道压缩
for(int i = 0; i < U->height; i++)
{
for(int j = 0; j < U->width; j++)
{
double element = CV_MAT_ELEM( *DCTU, double, i, j );
if ( abs(element) < 20 )
CV_MAT_ELEM( *DCTU, double, i, j ) = 0;
}
}
// V 通道压缩
for(int i = 0; i < V->height; i++)
{
for(int j = 0; j < V->width; j++)
{
double element = CV_MAT_ELEM( *DCTV, double, i, j );
if ( abs(element) < 20 )
CV_MAT_ELEM( *DCTV, double, i, j ) = 0;
}
}
cvDCT(DCTY, MatY, CV_DXT_INVERSE); //余弦反变换
cvDCT(DCTU, MatU, CV_DXT_INVERSE);
cvDCT(DCTV, MatV, CV_DXT_INVERSE);
cvScale( MatY, Y );
cvScale( MatU, U );
cvScale( MatV, V );
cvMerge( Y, U, V, NULL, YUVImage );
cvCvtColor( YUVImage, dst, CV_YUV2BGR); //YUV→BGR
// 计算前后两幅图像的PSNR值
for(int i = 0; i < src->height; i++)
{
for(int j = 0; j < src->width; j++)
{
SrcPixel = cvGet2D( src, i, j );
DstPixel = cvGet2D( dst, i, j );
sumB += ( SrcPixel.val[0] - DstPixel.val[0] ) * ( SrcPixel.val[0] - DstPixel.val[0] );
sumG += ( SrcPixel.val[1] - DstPixel.val[1] ) * ( SrcPixel.val[1] - DstPixel.val[1] );
sumR += ( SrcPixel.val[2] - DstPixel.val[2] ) * ( SrcPixel.val[2] - DstPixel.val[2] );
}
}
mseB = sumB / ((src->width) * (src->height)); //计算均方差
mseG = sumG / ((src->width) * (src->height));
mseR = sumR / ((src->width) * (src->height));
PSNR_B = 10.0 * ( log10( 255.0 * 255.0 / mseB ) );
PSNR_G = 10.0 * ( log10( 255.0 * 255.0 / mseG ) );
PSNR_R = 10.0 * ( log10( 255.0 * 255.0 / mseR ) );
PSNR=(PSNR_B + PSNR_G + PSNR_R) / 3;
cout << "B通道PSNR=" << PSNR_B << endl;
cout << "G通道PSNR=" << PSNR_G << endl;
cout << "R通道PSNR=" << PSNR_R << endl;
cout << "PSNR=" << PSNR << endl;
cvShowImage( "YImage", Y );
cvShowImage( "UImage", U );
cvShowImage( "VImage", V );
cvShowImage( "DstImage", dst );
cvSaveImage( "lena.bmp", dst);
while( 1 )
{
if( cvWaitKey(0) == 27 ) break;
}
cvDestroyWindow("YImage");
cvDestroyWindow("UImage");
cvDestroyWindow("VImage");
cvDestroyWindow("DstImage");
cvReleaseImage(&Y);
cvReleaseImage(&U);
cvReleaseImage(&V);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvReleaseImage(&YUVImage);
return 0;
}
在下面的路径
char* filename = argc >= 2 ? argv[1] : (char*)
"d:\\肌肉.jpg";
src= cvLoadImage( filename,1 ) ;
if( !src )
{
printf("can't open the image...\n");
return -1;
}
"d:\\肌肉.jpg"; 这个是没问题的,但是如果我使用 "d:\\倒立.jpg";(该位置确实有这个图片)它就会出现
图片压缩.exe 中的 0x753fb9bc 处有未经处理的异常: Microsoft C++ 异常: 内存位置 0x0038e03c 处的 cv::Exception。
问题
相关推荐
基于MATLAB实现的DCT图像编码器并进行调试分析.zip
资源包含文件:设计报告word+代码 1、使用matlab做界面设计,首先创建两个控件和一个edit框。两个button一个是打开图片,一个是进行DCT变换 2、在button1进行编辑callback,选取图片路径设为global变量以便在DCT变换中使用。分别显示原图、灰度图、DCT处理后图像 3、在DCT变换的button4中编辑callback函数,首先得到的D1 DCT图像进行压缩变换,压缩比在edit中由用户输入,同样设其为global在本callback函数中将其转换为number,由于此值var为cell类型【一维数组】不可按比例算出压缩后的图片,因此先转换成double类型,D2(1:data,1:data)=D1(1:data,1:data); 计算后再逆dct变换得到ID2显示 4、计算PSNR可直接使用psnr(ID2,I)来计算两图的峰值信噪比 详细介绍参考:https://blog.csdn.net/sheziqiong/article/details/125369415
MATLAB实现JPEG压缩算法程序源码.zip
【程序老媛出品,必属精品,亲测校正,质量保证】 资源名:MATLAB实现JPEG压缩算法程序源码.zip 资源类型:程序源代码 源码说明: 用MATLAB实现JPEG图像压缩算法,包括DCT变换,霍夫曼变换等算法,包含完整源码和注释,非常适合借鉴学习 适合人群:新手及有一定经验的开发人员
DCT压缩图片整个流程实现
此代码实现了DCT压缩图片的整个过程,包含交互的界面,可根据输入的压缩率等进行图片压缩
dct.zip_DCT图片水印
基于离散余弦变换即dct变化的水印图片的嵌入与提取
DCT.zip_The Image_quality checking
this is the code for DCT color image compression. You can check the compression quality by checking your output image which will be stored in current folder.


其它技术问题
