📄 dib.cpp
字号:
{*p=N[i][j];p++;}
return true;
}
bool CDib::ConvertToDctvalue()
{
DWORD size = m_dwDibSize - (m_pDibBits - m_pDib);
int x,y,i,j,u,v;int N=8; int temp=0;
int Len,Wid; unsigned char *p;
double **M,a,b;
Wid=m_pBIH->biWidth;
Len = m_pBIH->biHeight;
Wid=(Wid%8==0)?Wid:(Wid-Wid%8+8); Len=(Len%8==0)?Len:(Len-Len%8+8);
CSize sizeDib;
sizeDib.cx = (Wid%8==0)?Wid:(Wid-Wid%8+8);
//Wid=sizeDib.cx;
M=new double *[Len];
for(x=0;x<Len;x++){M[x]=new double [Wid];}
double **H;
H=new double *[Len];
for(x=0;x<Len;x++){H[x]=new double [Wid];}
int lei[16][2000];
for (i = 0; i <16;i++)
{
for(j=0; j<2000;j++)
{
lei[i][j]=0;
}
}
p = m_pDibBits;
for (i = 0; i <Len;i++)
{
for(j=0; j<Wid;j++)
{
M[i][j]=p[(i)*sizeDib.cx+j];
//M[i][j]=*p;
H[i][j]=0; //p++;
}
}
// char s[] = "基频";
char c = '\n'; stream = fopen( "word.txt", "w" );
// AfxMessageBox("Enter!");
for(i=0;i<Len/N;i++){
for(j=0;j<Wid/N;j++){
for(u=0;u<N;u++){
for(v=0;v<N;v++){
for(x=0;x<N;x++){
for(y=0;y<N;y++)
{
if(u==0)a=sqrt((double)1/N);else a=sqrt((double)2/N);
if(v==0)b=sqrt((double)1/N);else b=sqrt((double)2/N);
H[u+i*N][v+j*N]=H[u+i*N][v+j*N]+a*b*M[x+i*N][y+j*N]*cos((2*x+1)*u*pi/(2*N))*cos((2*y+1)*v*pi/(2*N));
}//for y
}//for x
H[u+i*N][v+j*N]=int(H[u+i*N][v+j*N]/10.0);
if(u==0&&v==0)
{ //基频差分编码
lei[0][0]++;
lei[0][lei[0][0]]=int(H[u+i*N][v+j*N]);
//fprintf( stream, "%d: %d %d \n",i, lei[0][0],lei[0][lei[0][0]]);
if(lei[0][0]>1)
{
if(lei[0][0]==2){ temp=lei[0][2]; lei[0][2]=lei[0][2]-lei[0][1]; }
if(lei[0][0]>2)
{
lei[0][lei[0][0]]=lei[0][lei[0][0]]-(temp); temp+=lei[0][lei[0][0]];
//lei[0][lei[0][0]]=(lei[0][lei[0][0]]/20)*20; //量化率可变
}//else
}
// fprintf( stream, "%d %d \n", lei[0][0],lei[0][lei[0][0]]);
}//if(u==0&&v==0)
else if(u<4&&v<4)
{ // H[u+i*N][v+j*N]=0;
lei[u*4+v][0]++;
lei[u*4+v][lei[u*4+v][0]]=int(H[u+i*N][v+j*N]); //lei[u*4+v][0]++;
//if(u==1&&v==2){fprintf( stream, "%d %d %d %d \n",i,j,lei[u*4+v][0],lei[u*4+v][lei[u*4+v][0]]);}
}//else if!(u==0&&v==0)
else
{H[u+i*N][v+j*N]=0;}
}//for v
}//for u
}//for j
// fprintf( stream, "%s%c", s, c );
}//for i
//for(i=0;i<=(Len/N)*(Wid/N);i++)
// {fprintf( stream, " %d \n",lei[0][i]/10);}
//将压缩文件输出
FILE *fp_o=fopen("image_code","wb");
unsigned char*ch;
ch=new unsigned char[int(Len/N)*(Wid/N)*16+2];
/*int *ch0;
ch0=new int[int(Len/N)*(Wid/N)*16+2];*/
ch[0]=int(Len/N);ch[1]=int(Wid/N);
int pp=2;
for(i=2;i<(Len/N)*(Wid/N)*16+2;i++)
{
ch[i]=0; //ch0[i]=0;
}
for(j=0;j<16;j++)
for(i=1;i<=lei[0][0];i++)
{
ch[pp]=lei[j][i]+128; //ch[pp]=lei[j][i]/10+128; fprintf( stream, "%d %d \n",pp,ch[pp]);
pp++;
}
fwrite(ch,1,(Len/N)*(Wid/N)*16+2,fp_o);
fclose(fp_o);
/*
FILE *fp_i=fopen("image_Dct.dct","rb");
fread(ch0,4,(Len/N)*(Wid/N)*16+2,fp_i);
fclose(fp_i);
for(i=0;i<(Len/N)*(Wid/N)*16+2;i++)
{
fprintf( stream, "%d ",ch0[i]);
} */
//output
p = m_pDibBits;
for(i=0;i<Len;i++)
{
for(j=0;j<Wid;j++)
{if (H[i][j]>255){p[(i)*sizeDib.cx+j]=255;}
else
{if (H[i][j]<0){p[(i)*sizeDib.cx+j]=0;}
else
{
p[(i)*sizeDib.cx+j]=(unsigned char)(H[i][j]);
}
}
}
}
fclose( stream );
system( "type word.txt" );
delete M;
return true;
}/////////////////////////////////////////////
bool CDib::ConvertToIDctvalue()
{
return true;
}
bool CDib::IIdct(int Len,int Wid,int *ch)
{
int x,y,i,j,u,v;int N=8;int l=0; int temp;
//int Len,Wid;
unsigned char *p;
p= new unsigned char [Len*Wid];
double **M,a,b;
/* Wid=m_pBIH->biWidth;
Len = m_pBIH->biHeight;
CSize sizeDib;
sizeDib.cx = (Wid%8==0)?Wid:(Wid-Wid%8+8); */
//read
Wid=ch[1]*N;
CSize sizeDib;
sizeDib.cx=(Wid%8==0)?Wid:(Wid-Wid%8+8);
M=new double *[Len];
for(x=0;x<Len;x++){M[x]=new double [Wid];}
int **H;
H=new int *[Len];
for(x=0;x<Len;x++){H[x]=new int [Wid];}
for (i = 0; i <Len;i++)
{
for(j=0; j<Wid;j++)
{
M[i][j]=0;H[i][j]=0;
}
}
temp=0;int pp=2;//H[0][0]=ch[2];temp=H[0][0];int pp=3;
for(i=0;i<Len/N;i++)
for(j=0;j<Wid/N;j++)
{
H[i*N][j*N]=temp+ch[pp]; temp=H[i*N][j*N];
H[i*N][j*N]=H[i*N][j*N];pp++;// fprintf( stream, "%d %d,%d \n",i,j,H[i*N][j*N]);
}
for(u=0;u<4;u++)
for(v=0;v<4;v++)
for(i=0;i<Len/N;i++)
for(j=0;j<Wid/N;j++)
{
if(!(u==0&&v==0))
{
H[i*N+u][v+j*N]=ch[pp];pp++;
//if(u==0&&v==1)fprintf(stream," %d",H[i*N][j*N+v]);
}
}
//fclose( stream );
//system( "type word.txt" );
//DCT逆变换
for(i=0;i<Len/N;i++){
for(j=0;j<Wid/N;j++){
for(x=0;x<N;x++){
for(y=0;y<N;y++){
for(u=0;u<4;u++){
for(v=0;v<4;v++)
{
if(u==0)a=sqrt((double)1/N);else a=sqrt((double)2/N);
if(v==0)b=sqrt((double)1/N);else b=sqrt((double)2/N);
M[x+i*N][y+j*N]=M[x+i*N][y+j*N]+a*b*H[u+i*N][v+j*N]*10.0*cos((2*x+1)*u*pi/(2*N))*cos((2*y+1)*v*pi/(2*N));
}
}
}
}
}
}
//输出
/* p = m_pDibBits;
for(i=0;i<Len;i++)
for(j=0;j<Wid;j++)
{
if(M[i][j]<0) p[(i)*sizeDib.cx+j]=0;
else p[(i)*sizeDib.cx+j]=(unsigned char)(M[i][j]);
}
p = m_pDibBits;
*/
for(i=0;i<Len;i++)
for(j=0;j<Wid;j++)
{
if(M[i][j]<0) p[(i)*sizeDib.cx+j]=0;
else if(M[i][j]>255) p[(i)*sizeDib.cx+j]=255;
else p[(i)*sizeDib.cx+j]=(unsigned char)(M[i][j]);
}
LONG w = (LONG)Wid;//(LONG)min(nWidth, m_nWidth - x);
LONG h = (LONG)Len;
//被保存位图每行的字节数
DWORD dwSaveWidthBytes = w;
//DIB位图数据大小, 以字节为单位
DWORD dwDibBitsSize = dwSaveWidthBytes *Len;
//计算整个Dib文件的大小dwFileSize
DWORD dwFileSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwDibBitsSize;
dwFileSize += (256 * sizeof(RGBQUAD));
//计算位图信息到位图数据间的偏移量(字节)
DWORD dwOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
dwOffBits += (256 * sizeof(RGBQUAD));
BITMAPFILEHEADER bmFileHeader;
BITMAPINFOHEADER bmInfo;
//填充BITMAPFILEHEADER结构
bmFileHeader.bfType=0x4d42;
bmFileHeader.bfSize = dwFileSize;
bmFileHeader.bfReserved1 = 0;
bmFileHeader.bfReserved2 = 0;
bmFileHeader.bfOffBits = dwOffBits;
//填充BITMAPINFOHEADER结构:8位仍然保存为8位, 其它均被保存为24位.最低显示模式为8位.
WORD wBitsPixel = (WORD)8;
// if(m_nBitCount != 8)wBitsPixel = 24;
bmInfo.biSize = sizeof(BITMAPINFOHEADER);
bmInfo.biWidth = w;
bmInfo.biHeight = h;
bmInfo.biPlanes = 1;
bmInfo.biBitCount = wBitsPixel;
bmInfo.biCompression = 0;
bmInfo.biSizeImage = 0;
bmInfo.biXPelsPerMeter = 0;
bmInfo.biYPelsPerMeter = 0;
bmInfo.biClrUsed = 0;
bmInfo.biClrImportant = 0;
CFile file((LPCTSTR )"recode.bmp", CFile::modeCreate |
CFile::modeReadWrite | CFile::shareExclusive);
file.Write((LPSTR)&bmFileHeader, sizeof(BITMAPFILEHEADER));
file.Write((LPSTR)&bmInfo, sizeof(BITMAPINFOHEADER));
RGBQUAD* pRGBQuad = new RGBQUAD[256];
if(pRGBQuad == NULL)return true;
//初始化为0
memset(pRGBQuad, 0, 256 * sizeof(RGBQUAD));
//创建表项:可能丢失颜色
GetPaletteEntries(pRGBQuad);
//写入数据
file.Write((LPSTR)pRGBQuad, 256 * sizeof(RGBQUAD));
delete[] pRGBQuad;
// file.Write(p, size);
DWORD dwLength = (DWORD)Wid;
UINT nZero = dwSaveWidthBytes - dwLength;
BYTE abyZero[] = {0, 0, 0};
//数据索引基数, 从下往上读
DWORD dwBaseIndex = 0;
for( i = 0; i < h ; i++)
{
unsigned char *lpsRaw = (unsigned char *)(p + dwBaseIndex);
//写入子数据, 注意数据量小于64k, 位图宽度可达22767个像素单位或更高
file.Write(lpsRaw, dwLength); //
//结尾补0
if(nZero > 0) file.Write((BYTE *)abyZero, nZero);
dwBaseIndex += Wid;
}
file.Close();
delete M;
return true;
}
//创建调色盘表项:其内容来自于系统调色盘
void GetPaletteEntries(RGBQUAD *pRGBQuad)
{
int index;
ASSERT(pRGBQuad);
// HDC hDC = ::GetDC(NULL); //If this value is NULL, GetDC retrieves the device context for the entire screen.
// PALETTEENTRY* paletteEntry = new PALETTEENTRY[256];
//获取系统调色盘的信息.系统调色盘的改变由系统来完成, 这里不能改变系统调色盘.我们希望这个类不要干涉系统事务
// ::GetSystemPaletteEntries(hDC, 0, 256, paletteEntry);
//::GetDIBColorTable(hDC, 0, 256, pRGBQuad);
for(index = 0; index < 256; index++)
{
pRGBQuad[index].rgbRed = index;
pRGBQuad[index].rgbGreen = index;
pRGBQuad[index].rgbBlue = index;
pRGBQuad[index].rgbReserved = 0;
}
}
////////////////////////////////////////////////////////
bool CDib::NN()
{
DWORD size;
int Len,Wid,i,j;
unsigned char *p;
p = m_pDibBits;
Wid=m_pBIH->biWidth;
Len =m_pBIH->biHeight;
CSize sizeDib;
sizeDib.cx = (Wid%4==0)?Wid:(Wid-Wid%4+4);
sizeDib.cy = Len;
size = m_dwDibSize - (m_pDibBits - m_pDib);
unsigned char ** M;//存储图像的二维数组
M=new unsigned char *[Len];
for(i=0;i<Len;i++){M[i]=new unsigned char[Wid];}
for (i = 0; i <Len;i++)//存图像
for(j=0; j<Wid;j++)
{
M[i][j] = p[(Len-i-1)*sizeDib.cx+j];
}
/* int ** bx;
bx=new int *[20];
for(i=0;i<20;i++){bx[i]=new int[8000];}
int ** by;
by=new int *[20];
for(i=0;i<20;i++){by[i]=new int[8000];} */
for (i = 0; i <20;i++)//存图像
for(j=0; j<8000;j++)
{ bx[i][j]=0; by[i][j]=0; }
bh=0,bl=1; int bbl=0; int li=0;int lj=0;
int k;
for(k=0;k<14;k++)
for (i = 0; i <256;i++)//存图像
for(j=0; j<256;j++)
{myimage[k][i][j]=0;
}
/////processing///////
//存样本图像
for (i = 0; i <Len;i++)
for(j=0; j<Wid;j++)
{
if(M[i][j]>0.0&&M[i][j]<255.0)
{ bl=1;
M[i][j]=255; bx[bh][bl]=i; by[bh][bl]=j; bl++;
li=i; lj=j; bbl=0;
loop1:
if((lj-1)>0)
{
if(M[li][lj-1]>0.0&&M[li][lj-1]<255.0)
{
M[li][lj-1]=255; bx[bh][bl]=li; by[bh][bl]=lj-1; bl++;
}}
if((lj+1)<Wid)
{
if(M[li][lj+1]>0.0&&M[li][lj+1]<255.0)
{
M[li][lj+1]=255; bx[bh][bl]=li; by[bh][bl]=lj+1; bl++;
}}
if((li-1)>0)
{
if(M[li-1][lj]>0.0&&M[li-1][lj]<255.0)
{
M[li-1][lj]=255; bx[bh][bl]=li-1; by[bh][bl]=lj; bl++;
}
if((lj-1)>0)
{
if(M[li-1][lj-1]>0.0&&M[li-1][lj-1]<255.0)
{
M[li-1][lj-1]=255; bx[bh][bl]=li-1; by[bh][bl]=lj-1; bl++;
}}
if((lj+1)<Wid)
{
if(M[li-1][lj+1]>0.0&&M[li-1][lj+1]<255.0)
{
M[li-1][lj+1]=255; bx[bh][bl]=li-1; by[bh][bl]=lj+1; bl++;
}}
}// if((i-1)>0)
if((li+1)<Len)
{
if(M[li+1][lj]>0.0&&M[li+1][lj]<255.0)
{
M[li+1][lj]=255; bx[bh][bl]=li+1; by[bh][bl]=lj; bl++;
}
if((lj-1)>0)
{
if(M[li+1][lj-1]>0.0&&M[li+1][lj-1]<255.0)
{
M[li+1][lj-1]=255; bx[bh][bl]=li+1; by[bh][bl]=lj-1; bl++;
}}
if((lj+1)<Wid)
{
if(M[li+1][lj+1]>0.0&&M[li+1][lj+1]<255.0)
{
M[li+1][lj+1]=255; bx[bh][bl]=li+1; by[bh][bl]=lj+1; bl++;
}
}
}//if((i+1)<Len)
bbl++;
if(bbl<bl){ li=bx[bh][bbl]; lj=by[bh][bbl];goto loop1; }
if(bbl==bl)
{ bx[bh][0]=bl; if(bl>15) {bh++;}
bl=1; li=0; lj=0;
}
}
}
/////out
p = m_pDibBits;
for(i=0;i<Len;i++)
for(j=0;j<Wid;j++)
{
p[(Len-i-1)*sizeDib.cx+j]=M[i][j];
}
delete M;
return true;
}
bool CDib::Readmyimage(int k)
{
int Len,Wid,i,j;
unsigned char *p;
p = m_pDibBits;
Wid=m_pBIH->biWidth;
Len =m_pBIH->biHeight;
CSize sizeDib;
sizeDib.cx = (Wid%4==0)?Wid:(Wid-Wid%4+4);
sizeDib.cy = Len;
//size = m_dwDibSize - (m_pDibBits - m_pDib);
for (i = 0; i <Len;i++)//存图像
for(j=0; j<Wid;j++)
{
myimage[k][i][j]=p[(Len-i-1)*sizeDib.cx+j];
}
return true;
}
/////////////////////////////////
bool CDib::study()
{
FILE *stream;
stream=fopen( "word.txt", "w" );
int i;int j;
unsigned char ** M;//存储图像的二维数组
M=new unsigned char *[256];
for(i=0;i<256;i++){M[i]=new unsigned char[256];}
for (i = 0; i <256;i++)//存图像
for(j=0; j<256;j++)
{
M[i][j]=0;
}
double f0[12]={0.0},f1[12]={0.0},f2[12]={0.0};
double temp; temp=0.0; int lpnum=3;
int k; int m; //m=0;
double avg[20][12]={0.0};
for(m=0;m<bh;m++)
{ /// m 类
lpnum=5;
loop1:
for(i=1;i<bx[m][0];i++)
{ // 每类的样本
//用样本点训练隶属函数的均值
for(k=0;k<12;k++) ///////////////k=12 yang ben num///
{//对每个点计算在各幅图中的隶属函数
temp=double(myimage[k][bx[m][i]][by[m][i]]);
f0[k]=1.0/(1.0+0.05*temp);
f1[k]=temp;//f1[k]=1.0/(1.0+0.05*double(abs(128.0-temp)));
f2[k]=1.0/(1.0+0.05*(256.0-temp));
if(i==1&&lpnum==3){avg[m][k]=f1[k];}
avg[m][k]=(avg[m][k]+f1[k])/2.0;
}
}
lpnum--;if(lpnum>0)goto loop1;
// fprintf(stream, "%d,%d,%f,%f\n", k,m,avg[m][3],avg[m][10]);
}
double cha[20]={0.0};
int n; double min; int minn;
//m=1;
//for(i=1;i<bx[m][0];i++)
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{ // 每类的样本与平均值的差
for(n=0;n<bh;n++)
{
cha[n]=0.0;
}
min=0;
for(k=0;k<12;k++)
{
if(myimage[k][i][j]>0.0) min=1;
}
if(min==0){M[i][j]=255;minn=8;}
else
{
for(k=0;k<12;k++) ///////////////k=12 yang ben num///
{//对每个点计算与各类均值的差
// temp=double(myimage[k][bx[m][i]][by[m][i]]);
// f0[k]=1.0/(1.0+0.05*temp);
// f1[k]=(128.0-temp)>0.0?(128.0-temp):(temp-128.0);
// f1[k]=1.0/(1.0+0.05*double(f1[k]));
// f2[k]=1.0/(1.0+0.05*(256.0-temp));
//f1[k]=double(myimage[k][bx[m][i]][by[m][i]]);
f1[k]=double(myimage[k][i][j]);
min=500;
for(n=0;n<bh;n++)
{ //计算与各类的差值之和
temp=(f1[k]-avg[n][k]); temp=temp>0.0?temp:(-temp);
cha[n]=cha[n]+temp/avg[n][k];
}
for(n=0;n<bh;n++)
{ //比较各类的差值之和,选择最小的归为该类
if(min>cha[n])
{
min=cha[n];minn=n;
}
}
if(min<0.6)
{
M[i][j]=minn;
//M[bx[m][i]][by[m][i]]=255; // M[i][j]=255;
}
else if(min>=0.6) { M[i][j]=100; }
// if(minn==m)M[bx[m][i]][by[m][i]]=255;
}
}//if(min==0)M[i][j]=0;
// fprintf(stream, "%d,%d,%f\n", i,minn,min);
}
fclose( stream );
system( "type word.txt" );
//////////
//////////out//////
//unsigned char *p;
//p = m_pDibBits;
for(i=0;i<256;i++)
for(j=0;j<256;j++)
{
myimage[0][i][j]=M[i][j];
//p[(256-i-1)*256+j]=M[i][j];
}
delete M;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -