小妹现在实在没分数了,希望各位高手帮我看看,急用呢!
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <MALLOC.H>
#include <math.h>
#include <iostream.h>
#include "direct.h"typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
float s(float x); /*计算a、c两个系数矩阵*/
float ABC(float a[],float b[],float c[]);/*三个矩阵方程,计算RGB像素*//*宏定义bmp相关数据结构*/
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER; /*位图文件头*/typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER; /*位图信息头格式定义*/typedef struct tagRGBTRIPLE {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
} RGBTRIPLE;/*位图阵列格式定义 构成一个3字节的RGBTRIPLE。*/
/*bmp数据结构宏定义结束*/BITMAPFILEHEADER bmfHeader; /*位图文件头*/
BITMAPINFOHEADER bmiHeader; /*位图信息头 */
RGBTRIPLE* m_ImageData; /*图象数据指针*/
void main()
{
int i,j;
int zoom=2;
float x_oldf,y_oldf;
float u,v;
long x_old,y_old,x_new,y_new;
float num=(float)1.0/zoom;
long w_old;
long h_old;
long w_new;
long h_new;
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
float a[4],c[4],bRed[16],bGreen[16],bBlue[16];
RGBTRIPLE * rgb;
FILE *fp;
FILE *fpoutdat;
char k[100]="4.bmp";
char sopen[100],ssave[100],ssavedir[100];
sprintf(sopen,".\\待测图片\\%s",k);
fp=fopen(sopen,"rb"); if(fp==NULL)
{
printf("Can't open the file test.bmp!\n");
exit(0);
}
fread(&bfType,sizeof(WORD),1,fp);
fread(&bfSize,sizeof(DWORD),1,fp);
fread(&bfReserved1,sizeof(WORD),1,fp);
fread(&bfReserved2,sizeof(WORD),1,fp);
fread(&bfOffBits,sizeof(DWORD),1,fp);
fread(&bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); /*获取位图信息头*/
w_old=bmiHeader.biWidth;
h_old=bmiHeader.biHeight;
if(w_old%4!=0)
w_old=w_old+(4-w_old%4); //修正位图宽度值
DWORD size=w_old*bmiHeader.biBitCount/8*h_old; //m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(w_old*h_old*3));
m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size));
fread(m_ImageData,sizeof(BYTE)*(size),1,fp); /*将rgb数据读入到m_ImageData中*/
fclose(fp);
/*对新的bmp数据进行改变*/
w_new=w_old*zoom;
h_new=h_old*zoom;
if(w_new%4!=0)
w_new=w_new+(4-w_new%4); //修正位图宽度值
DWORD size1=w_new*bmiHeader.biBitCount/8*h_new;
/*按照三次卷积进行变化*/
/*三次卷积公式:f(i+u,j+v)=a*b*c,其中a、c分别为与u、v有关的系数矩阵,b存储了与目的像素相关的原始像素*/
rgb=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));/*开辟新的bmp图象rgb数据存储区域*/
for(y_new=0;y_new<h_new;y_new++)
{
for(x_new=0;x_new<w_new;x_new++)
{
x_old=(long)(x_new*num);
y_old=(long)(y_new*num);
x_oldf=x_new*num;
y_oldf=y_new*num;
u=(float)(x_oldf-x_old);
v=(float)(y_oldf-y_old);
for(i=3;i>=0;i--)
a[i]=s(u-i+1); for(i=3;i>=0;i--)
c[i]=s(v-i+1); /*计算系数矩阵*/ if((x_old>=0) && (x_old<w_old) && (y_old>=0) && (y_old<h_old))
{
for(i=0;i<4;i++)
for(j=0;j<4;j++) /*与目的像素相关的16个原始像素RGB*/
{if((j-1)<=0)
{
bBlue[i*4+j]=m_ImageData[0].rgbBlue;
bGreen[i*4+j]=m_ImageData[0].rgbGreen;
bRed[i*4+j]=m_ImageData[0].rgbRed;}
else
{
bBlue[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbBlue;
bGreen[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbGreen;
bRed[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbRed;
}
}
rgb[y_new*w_new+x_new].rgbBlue=(BYTE)ABC(a,bBlue,c);/*调用ABC求得目的像素*/
rgb[y_new*w_new+x_new].rgbGreen=(BYTE)ABC(a,bGreen,c);
rgb[y_new*w_new+x_new].rgbRed=(BYTE)ABC(a,bRed,c);
} }
}
free(m_ImageData);
m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));
for(i=0;i<w_new*h_new;i++)
{
m_ImageData[i].rgbBlue=rgb[i].rgbBlue;
m_ImageData[i].rgbGreen=rgb[i].rgbGreen;
m_ImageData[i].rgbRed=rgb[i].rgbRed;
}
bmiHeader.biWidth=w_new;
bmiHeader.biHeight=h_new;
fpoutdat=fopen(".\\0.bmp","w+");
if(fpoutdat==NULL)
{
printf("Can't open the file test.dat!\n");
} fwrite(&bfType,sizeof(WORD),1,fpoutdat);
fwrite(&bfSize,sizeof(DWORD),1,fpoutdat);
fwrite(&bfReserved1,sizeof(WORD),1,fpoutdat);
fwrite(&bfReserved2,sizeof(WORD),1,fpoutdat);
fwrite(&bfOffBits,sizeof(DWORD),1,fpoutdat);
fwrite(&bmiHeader,1,sizeof(bmiHeader),fpoutdat);
fwrite(m_ImageData,1,sizeof(BYTE)*(size1),fpoutdat);
fclose(fpoutdat);
free(rgb);
free(m_ImageData);
printf("Change Successfully!");}float s(float x) /*S(x)是对 Sin(x*Pi)/x 的逼近(Pi是圆周率——π)*/
{
if(abs(x)>=0&&abs(x)<1)
return (1-2*abs(x)*abs(x)+abs(x)*abs(x)*abs(x));
else
if(abs(x)>=1&&abs(x)<2)
return (4-8*abs(x)+5*abs(x)*abs(x)-abs(x)*abs(x)*abs(x)); else
return 0;
}float ABC(float a[],float b[],float c[]) /*求得像素值,内积*/
{
int i,j,k;
float abc=0;
float tmp[4];
for(i=0;i<4;i++)
tmp[i]=0;
for(k=0;k<4;k++)
for(i=0;i<4;i++)
for(j=0;j<4;j++)
tmp[k]+=a[i]*b[i*4+j];
for(i=0;i<4;i++)
abc+=tmp[i]*c[i];
return abc;
}
代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <MALLOC.H>
#include <math.h>
#include <iostream.h>
#include "direct.h"typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
float s(float x); /*计算a、c两个系数矩阵*/
float ABC(float a[],float b[],float c[]);/*三个矩阵方程,计算RGB像素*//*宏定义bmp相关数据结构*/
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER; /*位图文件头*/typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
DWORD biWidth;
DWORD biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
DWORD biXPelsPerMeter;
DWORD biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER; /*位图信息头格式定义*/typedef struct tagRGBTRIPLE {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
} RGBTRIPLE;/*位图阵列格式定义 构成一个3字节的RGBTRIPLE。*/
/*bmp数据结构宏定义结束*/BITMAPFILEHEADER bmfHeader; /*位图文件头*/
BITMAPINFOHEADER bmiHeader; /*位图信息头 */
RGBTRIPLE* m_ImageData; /*图象数据指针*/
void main()
{
int i,j;
int zoom=2;
float x_oldf,y_oldf;
float u,v;
long x_old,y_old,x_new,y_new;
float num=(float)1.0/zoom;
long w_old;
long h_old;
long w_new;
long h_new;
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
float a[4],c[4],bRed[16],bGreen[16],bBlue[16];
RGBTRIPLE * rgb;
FILE *fp;
FILE *fpoutdat;
char k[100]="4.bmp";
char sopen[100],ssave[100],ssavedir[100];
sprintf(sopen,".\\待测图片\\%s",k);
fp=fopen(sopen,"rb"); if(fp==NULL)
{
printf("Can't open the file test.bmp!\n");
exit(0);
}
fread(&bfType,sizeof(WORD),1,fp);
fread(&bfSize,sizeof(DWORD),1,fp);
fread(&bfReserved1,sizeof(WORD),1,fp);
fread(&bfReserved2,sizeof(WORD),1,fp);
fread(&bfOffBits,sizeof(DWORD),1,fp);
fread(&bmiHeader,sizeof(BITMAPINFOHEADER),1,fp); /*获取位图信息头*/
w_old=bmiHeader.biWidth;
h_old=bmiHeader.biHeight;
if(w_old%4!=0)
w_old=w_old+(4-w_old%4); //修正位图宽度值
DWORD size=w_old*bmiHeader.biBitCount/8*h_old; //m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(w_old*h_old*3));
m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size));
fread(m_ImageData,sizeof(BYTE)*(size),1,fp); /*将rgb数据读入到m_ImageData中*/
fclose(fp);
/*对新的bmp数据进行改变*/
w_new=w_old*zoom;
h_new=h_old*zoom;
if(w_new%4!=0)
w_new=w_new+(4-w_new%4); //修正位图宽度值
DWORD size1=w_new*bmiHeader.biBitCount/8*h_new;
/*按照三次卷积进行变化*/
/*三次卷积公式:f(i+u,j+v)=a*b*c,其中a、c分别为与u、v有关的系数矩阵,b存储了与目的像素相关的原始像素*/
rgb=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));/*开辟新的bmp图象rgb数据存储区域*/
for(y_new=0;y_new<h_new;y_new++)
{
for(x_new=0;x_new<w_new;x_new++)
{
x_old=(long)(x_new*num);
y_old=(long)(y_new*num);
x_oldf=x_new*num;
y_oldf=y_new*num;
u=(float)(x_oldf-x_old);
v=(float)(y_oldf-y_old);
for(i=3;i>=0;i--)
a[i]=s(u-i+1); for(i=3;i>=0;i--)
c[i]=s(v-i+1); /*计算系数矩阵*/ if((x_old>=0) && (x_old<w_old) && (y_old>=0) && (y_old<h_old))
{
for(i=0;i<4;i++)
for(j=0;j<4;j++) /*与目的像素相关的16个原始像素RGB*/
{if((j-1)<=0)
{
bBlue[i*4+j]=m_ImageData[0].rgbBlue;
bGreen[i*4+j]=m_ImageData[0].rgbGreen;
bRed[i*4+j]=m_ImageData[0].rgbRed;}
else
{
bBlue[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbBlue;
bGreen[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbGreen;
bRed[i*4+j]=m_ImageData[(y_old+j-1)*w_old+(x_old+i-1)].rgbRed;
}
}
rgb[y_new*w_new+x_new].rgbBlue=(BYTE)ABC(a,bBlue,c);/*调用ABC求得目的像素*/
rgb[y_new*w_new+x_new].rgbGreen=(BYTE)ABC(a,bGreen,c);
rgb[y_new*w_new+x_new].rgbRed=(BYTE)ABC(a,bRed,c);
} }
}
free(m_ImageData);
m_ImageData=(RGBTRIPLE*)malloc(sizeof(BYTE)*(size1));
for(i=0;i<w_new*h_new;i++)
{
m_ImageData[i].rgbBlue=rgb[i].rgbBlue;
m_ImageData[i].rgbGreen=rgb[i].rgbGreen;
m_ImageData[i].rgbRed=rgb[i].rgbRed;
}
bmiHeader.biWidth=w_new;
bmiHeader.biHeight=h_new;
fpoutdat=fopen(".\\0.bmp","w+");
if(fpoutdat==NULL)
{
printf("Can't open the file test.dat!\n");
} fwrite(&bfType,sizeof(WORD),1,fpoutdat);
fwrite(&bfSize,sizeof(DWORD),1,fpoutdat);
fwrite(&bfReserved1,sizeof(WORD),1,fpoutdat);
fwrite(&bfReserved2,sizeof(WORD),1,fpoutdat);
fwrite(&bfOffBits,sizeof(DWORD),1,fpoutdat);
fwrite(&bmiHeader,1,sizeof(bmiHeader),fpoutdat);
fwrite(m_ImageData,1,sizeof(BYTE)*(size1),fpoutdat);
fclose(fpoutdat);
free(rgb);
free(m_ImageData);
printf("Change Successfully!");}float s(float x) /*S(x)是对 Sin(x*Pi)/x 的逼近(Pi是圆周率——π)*/
{
if(abs(x)>=0&&abs(x)<1)
return (1-2*abs(x)*abs(x)+abs(x)*abs(x)*abs(x));
else
if(abs(x)>=1&&abs(x)<2)
return (4-8*abs(x)+5*abs(x)*abs(x)-abs(x)*abs(x)*abs(x)); else
return 0;
}float ABC(float a[],float b[],float c[]) /*求得像素值,内积*/
{
int i,j,k;
float abc=0;
float tmp[4];
for(i=0;i<4;i++)
tmp[i]=0;
for(k=0;k<4;k++)
for(i=0;i<4;i++)
for(j=0;j<4;j++)
tmp[k]+=a[i]*b[i*4+j];
for(i=0;i<4;i++)
abc+=tmp[i]*c[i];
return abc;
}
最近邻差值效果比较差,我是准备放大后识别用的,清晰点的比较好.