图片压缩 dct 变换

qyzxeqxw qyzxeqxw 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
下面是出问题的代码
#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

shejizuopin

MATLAB实现JPEG压缩算法程序源码.zip

【程序老媛出品,必属精品,亲测校正,质量保证】 资源名:MATLAB实现JPEG压缩算法程序源码.zip 资源类型:程序源代码 源码说明: 用MATLAB实现JPEG图像压缩算法,包括DCT变换,霍夫曼变换等算法,包含完整源码和注释,非常适合借鉴学习 适合人群:新手及有一定经验的开发人员

毕业设计方案专家

DCT压缩图片整个流程实现

此代码实现了DCT压缩图片的整个过程,包含交互的界面,可根据输入的压缩率等进行图片压缩

nzkaygejee_dhh_79575

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.

寒泊
评论 1
收藏 已收藏
分享
返回顶部
qyzxeqxw
其它技术问题 3,881 成员 9,044 内容