LBG算法的C源代码

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

#includeiostream#includestdlib.h#includeBitmap.husingnamespacestd;intmain(intargc,char*argv[]){cout512/4endl;cout517-517%4endl;srand((unsigned)time(NULL));//为了得到随机数CBitmapbitmap;intnFlag=0;charszInfile[100];//文件名stringstrChoice;cout输入所要处理的文件名;cin.getline(szInfile,100);nFlag=bitmap.Init(szInfile);//nFlag等于0才是满足条件的文件//必须是BMP文件//必须是256色的8位位图if(nFlag==0){bitmap.LBG();}//system(PAUSE);return0;}//在1~s内生成一个随机数intget_rand(ints){inti;i=rand()%s+1;returni;}#includeBitmap.hintCBitmap::Init(char*szInfile){intnFlag=0;infile.open(szInfile,ios::in|ios::binary);//不能打开文件if(!infile){cout不能成功打开文件szInfileendl;nFlag=1;returnnFlag;}infile.read((char*)&strHead,sizeof(strHead));//文件不是位图文件if(strHead.bfType!=0x4d42){cout该图不是位图\n;nFlag=1;returnnFlag;}//文件是位图文件,显示相关信息else{intfilesize;int*p=(int*)strHead.bfSize;filesize=*p;cout文件大小:'\t'filesize'\n'点阵偏移量:'\t'strHead.bfOffBitsendl;cout\n矩阵大小:filesize-sizeof(RGBQUAD)-sizeof(strHead)-sizeof(strInfo)endl;}infile.read((char*)&strInfo,sizeof(strInfo));//使用的不是256色的位图if(strInfo.biBitCount!=8){cout使用的颜色数:strInfo.biClrUsed像素点阵大小:strInfo.biSizeImage像素位深:strInfo.biBitCountendl;cout非256色\n;nFlag=1;returnnFlag;}coutendl;cout使用的颜色数:'\t'strInfo.biClrUsed'\n'像素点阵大小:'\t'strInfo.biSizeImage'\n'像素位深:'\t'strInfo.biBitCount'\n'图像大小\n宽'\t'strInfo.biWidth'\n'高'\t'strInfo.biHeightendl;//读入调色板信息for(inti=0;i256;i++)infile.read((char*)&straPla[i],sizeof(RGBQUAD));//infile.close();returnnFlag;}//LBG算法函数voidCBitmap::LBG(){inti;unsignedchar**data;//输入文件要存放的二维数组unsignedchar**codebk;//码书intm_sig=strInfo.biHeight;//图像高度intn_sig=strInfo.biWidth;//图像宽度intwordSize=4;//码字的长度intbookSize=64;//码书长度coutWordSize:\t;//请求用户输入码字长度cinwordSize;coutBookSize:\t;//请求用户输入码书长度cinbookSize;inthnum=m_sig/wordSize;intwnum=n_sig/wordSize;intss=wordSize*wordSize;//码字,是一个小矩形intnn=hnum*wnum;//整个图象被分成的子图个数unsignedchar**re_sig;//存放中间过程的图像//unsignedcharre_re_sig[512+1][512+1];//使用data替换cout\n正在LBG......\n请稍等......\n;//原始位图输入分配空间,每一行if((data=(unsignedchar**)malloc((m_sig+1)*sizeof(unsignedchar*)))==NULL){fprintf(stderr,内存不足!\n);//nomorememoryexit(1);}//每一列for(i=0;i=m_sig;i++)if((data[i]=(unsignedchar*)malloc((n_sig+1)*sizeof(unsignedchar)))==NULL)//维数{fprintf(stderr,内存不足!\n);exit(1);}//分配码书空间,码书是一个二维数组if((codebk=(unsignedchar**)malloc((bookSize+1)*sizeof(unsignedchar*)))==NULL){fprintf(stderr,内存不足!\n);//nomorememoryexit(1);}//为码书中的每一个码字分配空间for(i=0;i=bookSize;i++)if((codebk[i]=(unsignedchar*)malloc((ss+1)*sizeof(unsignedchar)))==NULL)//维数{fprintf(stderr,内存不足!\n);exit(1);}//中间处理过程的存储if((re_sig=(unsignedchar**)malloc((nn+1)*sizeof(unsignedchar*)))==NULL){fprintf(stderr,内存不足!\n);//nomorememoryexit(1);}//每个子图中,为每一个码字分配空间for(i=0;i=nn;i++)if((re_sig[i]=(unsignedchar*)malloc((ss+1)*sizeof(unsignedchar)))==NULL)//维数{fprintf(stderr,内存不足!\n);exit(1);}infile.seekg(strHead.bfOffBits,ios::beg);//读入,从点阵偏移量以后开始//一行一行读取,每读取一行存放到一个data[i][]数组里for(i=1;i=m_sig;i++)infile.read((char*)&data[i][1],n_sig*sizeof(char));infile.close();//切割图片//将原图像的每一行按码字的长度分割,然后存到re_sig的前四列//以此类推,第二行是接下来的四列for(i=1;i=m_sig;i++)for(intj=1;j=n_sig;j++){//intintf1=floor((double)i/wordSize);intm1=i%wordSize;if(m1==0){m1=wordSize;f1--;}//intintf2=floor((double)j/wordSize);intm2=j%wordSize;if(m2==0){m2=wordSize;f2--;}re_sig[hnum*f1+f2+1][wordSize*(m1-1)+m2]=data[i][j];}////////////////////////以下开始求取码书////////////////////////使用随机编码法求取初始码书,计算量低//给码书赋值,for(i=1;i=bookSize;i++)for(intj=1;j=ss;j++){intr=get_rand(nn);codebk[i][j]=re_sig[r][j];//每次从所有的子图中随机取一个值}/***LBG训练法*d0d1用于存放各训练矢量与其码书中最相近的码字的距离平方之和*sea用于存放迭代精度**/doubled0=0.0;//每个输入向量与codebk[1]的距离for(i=1;i=nn;i++)for(intti=1;ti=ss;ti++)d0=d0+pow((double)((int)re_sig[i][ti]-(int)codebk[1][ti]),2);while(1){//intvectorNumber[64+1];//vectorNumber存储的是码书中的某一个码字的计数//表示这个向量和训练向量距离最近的次数int*vectorNumber;//分配空间if((vectorNumber=(int*)malloc((bookSize+1)*sizeof(int)))==NULL){fprintf(stderr,内存不足!\n);exit(1);}//intcodeNumber[512*512/16+1];//某一个向量会和某一个码字距离最近,codeNumber存储//的是这个码字的索引,每一个训练向量都有一个对应的//码字索引int*codeNumber;//分配空间if((codeNumber=(int*)malloc((nn+1)*sizeof(int)))==NULL){fprintf(stderr,内存不足!\n);exit(1);}//d1存储的是第i个训练向量和码字的最短距离doubled1=0.0;for(i=1;i=bookSize;i++)vectorNumber[i]=0;//初始化为零//对于所有的输入向量for(i=1;i=nn;i++){codeNumber[i]=1;doublemin=0.0;for(intti=1;ti=ss;ti++)min=min+pow((double)((int)re_sig[i][ti]-(int)codebk[1][ti]),2);//第i个训练向量对codebk[1]的距离//if(min0)//system(pause);//求最小的值for(intj=1;j=bookSize;j++){doubled=0.0;for(intpp=1;pp=ss;pp++){d=d+pow((double)((int)re_sig[i][pp]-(int)codebk[j][pp]),2);if(d=min)break;}//第i个训练向量对第j个码字的距离小于对第1个码字的距离//更新最小距离和第i个码字序号if(dmin){min=d;codeNumber[i]=j;//将第i个训练向量的Number记为和它距离最小的码字的序号}}//经过上面的for循环,就能够得到第i个训练向量对于第j个码字的距离最小//与i距离最小的索引inttemp=codeNumber[i];vectorNumber[temp]=vectorNumber[temp]+1;//对第j个码字距离最小,将这个码字的索引计数加1d1+=min;//d1存放最小的距离}//求迭代精度doublesea=(d0-d1)/d1;//如果达到了指定的精度,跳出while循环if(sea=0.0001)break;//如果没有达到指定的精度,还要继续迭代d0=d1;for(intj=1;j=bookSize;j++){//某一个码字的标记不是0,就是上面求得的最小距离的码字if(vect

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功