【图像处理】DCT图像压缩算法(C++与Matlab)

以下是原创的C++代码,可在VC6.0及以上版本测试,相关头文件若缺失请在百度或谷歌下载。
#include
#include "BmpRot.h"
#include "stdlib.h"
#include "math.h"
#include
#include //#include "stdafx.h"
#define pi 3.14159//圆周率宏定义
#define LENGTH_NAME_BMP 30//bmp图片文件名的最大长度
#define num 8
float s[8][8];
float t[8][8];
int n=1,u,v,cv,cu;
using namespace std; //变量定义
BITMAPFILEHEADER strHead;
RGBQUAD strPla[256];//256色调色板
BITMAPINFOHEADER strInfo; //显示位图文件头信息
void showBmpHead(BITMAPFILEHEADER pBmpHead){ cout<<"位图文件头:"<-10 ){output[u][v]=0;}}}}void idct(float input[num][num],float output[num][num])
{short i,j,u,v;double cu,cv;for(i = 0;i < num;i++){for(j = 0;j < num;j++){double tmp=0.0;for(u = 0;u < num;u++){for(v = 0;v < num;v++){if(u==0)cu = sqrt(1.0/2.0);elsecu = 1;if(v==0)cv = sqrt(1.0/2.0);elsecv = 1;tmp+= (cu*cv/4.0) * (input[u][v])* cos( (2*i+1) * u * pi / (2.0*num))* cos( (2*j+1) * v * pi / (2.0*num));}}output[i][j]=tmp;}}
}int main(){ char strFile[LENGTH_NAME_BMP];//bmp文件名 IMAGEDATA *imagedata = NULL;//动态分配存储原图片的像素信息的二维数组 IMAGEDATA *imagedataRot = NULL;//动态分配存储旋转后的图片的像素信息的二维数组 IMAGEDATA *imagedataRot1 = NULL;IMAGEDATA *imagedataRot2 = NULL;int width,height,temp;//图片的宽度和高度cout<<"请输入所要读取的文件名:"<>strFile; FILE *fpi,*fpw; fpi=fopen(strFile,"rb"); if(fpi != NULL){ //先读取文件类型 WORD bfType; fread(&bfType,1,sizeof(WORD),fpi); if(0x4d42!=bfType) { cout<<"the file is not a bmp file!"<=4 )s[x][y]=0;}}idct(s,t);for(i = 0;i < 8;i++){for(j = 0;j < 8;j++){(*(imagedataRot + (m*8+i )* width + n*8+j)).blue=(unsigned char)t[i][j]; }}}}//保存bmp图片 if((fpw=fopen("b.bmp","wb"))==NULL) { cout<<"create the bmp file error!"<

Matlab版本会在后面更新,敬请期待!Matlab效果如下:


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
