📄 image_bw.cpp
字号:
for (i = 0; i < nx; i++) {
memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
#ifdef LOSSLESS
SP_Transform(my, in_line, coeff[i], coeff[i] + my); } }
#else
Reflection(in_line, in_line + ny - 1);
for (j = 0, t = in_line; j < my; j++) {
coeff[i][j] = Filter_L(T_LowPass, t++);
coeff[i][j+my] = Filter_H(T_HighPass, t++); } } }
#endif
delete [] temp_line;
// levels=-1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void Image_BW::recover(void){ if (levels <= 0) Error("cannot recover < Image_BW >"); Chronometer cpu_time; cpu_time.start("\n Starting inverse transformation...");#ifdef LOSSLESS int i = 0, j = Max(dim.x, dim.y), k = j << 1;#else int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);#endif CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG); Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j; int mx, my, nx = dim.x >> levels, ny = dim.y >> levels; Pel_Type s=0, mse, psnr, peak_2=65025.0;// add mean for (i = 0; i < nx; i++) for (j = 0; j < ny; j++) coeff[i][j] += mean;// inverse hierarchical subband or S+P transformation for (int lv = 0; lv < levels; lv++) { // shifts are doubled mx = nx; nx <<= 1; my = ny; ny <<= 1; // inverse transformation of rows for (i = 0; i < nx; i++) {#ifdef LOSSLESS memcpy(in_line, coeff[i], ny * sizeof(Pel_Type)); SP_Recover(my, in_line, in_line + my, coeff[i]); }#else for (j = 0, t = in_line; j < my; j++) { *(t++) = coeff[i][j]; *(t++) = coeff[i][j+my]; } Reflection(in_line, in_line + ny - 1); for (j = 0, t = in_line; j < ny;) { coeff[i][j++] = Filter_H(R_HighPass, t++); coeff[i][j++] = Filter_L(R_LowPass, t++); } }#endif // inverse transformation of columns for (j = 0; j < ny; j++) {#ifdef LOSSLESS for (i = 0; i < nx; i++) in_line[i] = coeff[i][j]; SP_Recover(mx, in_line, in_line + mx, out_line); for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }#else for (i = 0, t = in_line; i < mx; i++) { *(t++) = coeff[i][j]; *(t++) = coeff[i+mx][j]; } Reflection(in_line, in_line + nx - 1); for (i = 0, t = in_line; i < nx;) { coeff[i++][j] = Filter_H(R_HighPass, t++); coeff[i++][j] = Filter_L(R_LowPass, t++); } } }#endif
mse = compare(0,"input.y");
if (mse > 0.0) {
psnr = dBW(peak_2 / mse);
printf("mean squared-error =%8.3f =%7.2f dB PSNR\n", mse, psnr); }
/* for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++) s+=coeff[i][j] ;
long mean1 = Round((s / double(144)) / 176);
for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++) coeff[i][j]-=mean1;
for(i=0;i<10;i++)
for(int j=0;j<10;j++)
printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
levels = 0; delete [] temp_line; cpu_time.display(" Image transformed in");}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Image_BW::recover(unsigned char ** Wcoeff)
{
if (levels <= 0) Error("cannot recover < Image_BW >");
Chronometer cpu_time;
cpu_time.start("\n Starting inverse transformation...");
#ifdef LOSSLESS
int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;
int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
Pel_Type s=0;
double mse, psnr,peak_2 = 65025.0;
// add mean
for (i = 0; i < nx; i++)
for (j = 0; j < ny; j++) coeff[i][j] += mean;
// inverse hierarchical subband or S+P transformation
for (int lv = 0; lv < levels; lv++) {
// shifts are doubled
mx = nx; nx <<= 1; my = ny; ny <<= 1;
// inverse transformation of rows
for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
for (j = 0, t = in_line; j < my; j++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i][j+my]; }
Reflection(in_line, in_line + ny - 1);
for (j = 0, t = in_line; j < ny;) {
coeff[i][j++] = Filter_H(R_HighPass, t++);
coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif
// inverse transformation of columns
for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
SP_Recover(mx, in_line, in_line + mx, out_line);
for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
for (i = 0, t = in_line; i < mx; i++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i+mx][j]; }
Reflection(in_line, in_line + nx - 1);
for (i = 0, t = in_line; i < nx;) {
coeff[i++][j] = Filter_H(R_HighPass, t++);
coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif
for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++)
{
s+=coeff[i][j];
Wcoeff[i][j]=coeff[i][j]+0.5;
}
levels = 0;
mse = compare(0,"input.y");
if (mse > 0.0) {
psnr = dBW(peak_2 / mse);
printf("mean squared-error =%8.3f =%7.2f dB PSNR\n", mse, psnr); }
long mean1 = Round((s / double(144)) / 176);
for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++) coeff[i][j]-=mean1;
/* for(i=0;i<10;i++)
for(int j=0;j<10;j++)
printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
delete [] temp_line;
cpu_time.display(" Image transformed in");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Image_BW::recover(long mean)
{
if (levels <= 0) Error("cannot recover < Image_BW >");
Chronometer cpu_time;
cpu_time.start("\n Starting inverse transformation...");
#ifdef LOSSLESS
int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;
int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
Pel_Type s=0;
// add mean
/* for (i = 0; i < nx; i++)
for (j = 0; j < ny; j++) coeff[i][j] += mean;*/
// inverse hierarchical subband or S+P transformation
for (int lv = 0; lv < levels; lv++) {
// shifts are doubled
mx = nx; nx <<= 1; my = ny; ny <<= 1;
// inverse transformation of rows
for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
for (j = 0, t = in_line; j < my; j++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i][j+my]; }
Reflection(in_line, in_line + ny - 1);
for (j = 0, t = in_line; j < ny;) {
coeff[i][j++] = Filter_H(R_HighPass, t++);
coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif
// inverse transformation of columns
for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
SP_Recover(mx, in_line, in_line + mx, out_line);
for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
for (i = 0, t = in_line; i < mx; i++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i+mx][j]; }
Reflection(in_line, in_line + nx - 1);
for (i = 0, t = in_line; i < nx;) {
coeff[i++][j] = Filter_H(R_HighPass, t++);
coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif
for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++) coeff[i][j] += mean;
/* for(i=0;i<10;i++)
for(int j=0;j<10;j++)
printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
levels = 0; delete [] temp_line;
cpu_time.display(" Image transformed in");
}
//----------------------------------------------------------------------
void Image_BW::recover(long mean, Pel_Type ** recoeff)
{
if (levels <= 0) Error("cannot recover < Image_BW >");
Chronometer cpu_time;
cpu_time.start("\n Starting inverse transformation...");
#ifdef LOSSLESS
int i = 0, j = Max(dim.x, dim.y), k = j << 1;
#else
int i = NumbTap, j = 0, k = Max(dim.x, dim.y) + (i << 1);
#endif
CREATE_VECTOR(temp_line, k, Pel_Type, M_MSG);
Pel_Type * t, * in_line = temp_line + i, * out_line = in_line + j;
int mx, my, nx = dim.x >> levels, ny = dim.y >> levels;
Pel_Type s=0;
// add mean
/* for (i = 0; i < nx; i++)
for (j = 0; j < ny; j++) coeff[i][j] += mean;*/
// inverse hierarchical subband or S+P transformation
for (int lv = 0; lv < levels; lv++) {
// shifts are doubled
mx = nx; nx <<= 1; my = ny; ny <<= 1;
// inverse transformation of rows
for (i = 0; i < nx; i++) {
#ifdef LOSSLESS
memcpy(in_line, coeff[i], ny * sizeof(Pel_Type));
SP_Recover(my, in_line, in_line + my, coeff[i]); }
#else
for (j = 0, t = in_line; j < my; j++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i][j+my]; }
Reflection(in_line, in_line + ny - 1);
for (j = 0, t = in_line; j < ny;) {
coeff[i][j++] = Filter_H(R_HighPass, t++);
coeff[i][j++] = Filter_L(R_LowPass, t++); } }
#endif
// inverse transformation of columns
for (j = 0; j < ny; j++) {
#ifdef LOSSLESS
for (i = 0; i < nx; i++) in_line[i] = coeff[i][j];
SP_Recover(mx, in_line, in_line + mx, out_line);
for (i = 0; i < nx; i++) coeff[i][j] = out_line[i]; } }
#else
for (i = 0, t = in_line; i < mx; i++) {
*(t++) = coeff[i][j]; *(t++) = coeff[i+mx][j]; }
Reflection(in_line, in_line + nx - 1);
for (i = 0, t = in_line; i < nx;) {
coeff[i++][j] = Filter_H(R_HighPass, t++);
coeff[i++][j] = Filter_L(R_LowPass, t++); } } }
#endif
for (i = 0; i < 144; i++)
for (j = 0; j < 176; j++)
{
recoeff[i][j]=coeff[i][j];
coeff[i][j] += mean;
}
/* for(i=0;i<10;i++)
for(int j=0;j<10;j++)
printf("coeff[%d][%d]=%f",i,j,coeff[i][j]);*/
levels = 0; delete [] temp_line;
cpu_time.display(" Image transformed in");
}
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =void Image_BW::decimate(int select, int level1)
{
int i, j, mx = dim.x, my = dim.y;
for (i = 0; i < mx; i++)
for (j = select; j < my; j+=2)
if (fabs(coeff[i][j])<level1) coeff[i][j]=.0;
}
/*
void Image_BW::decimate1(int s, int level1) //对1,2,3的特殊处理,描述1,2-->1
{
int i, j, mx = dim.x, my = dim.y, k, k1=level1>>1, k2=level1>>2;
for (i = 0; i < mx; i++)
for (j = 0; j < my; j++)
if ((k=(int)fabs(coeff[i][j]))<level1 && k>=k2 ) {//相当于原先对1,2,3的处理。2=(1,0),3=(1,1),1=(0,1)
if (!s) coeff[i][j]/=2.;//描述1,去掉倒数第1位
else if(k>=<k1) {//描述2,去掉倒数第2位
if (coeff[i][j]>0) coeff[i][j]-=(double)k1;
else coeff[i][j]+=(double)k1;
}
else if(k<k1+k2) coeff[i][j]=0;//描述2,2-->0
}
}
*/
void Image_BW::decimate2(int level1) //对1,2,3的特殊处理
{
int i, j, mx = dim.x, my = dim.y, k, k1=level1>>1, k2=level1>>2;
for (i = 0; i < mx; i++)
for (j = 0; j < my; j++)
if ((k=(int)fabs(coeff[i][j]))<level1 && k>=k2 ) {//相当于原先对1,2,3的处理。2=(1,0),3=(1,1),1=(0,1)
if(k<k1) {//描述2,1-->2
if (coeff[i][j]>0) coeff[i][j]+=(double)k2;
else coeff[i][j]-=(double)k2;
}
else if(k<k1+k2) coeff[i][j]=0;//描述2,2-->0
}
}
void Image_BW::coewrite(void)
{
int i,j;
FILE * cmp_file = fopen("cmpfile", "wb");
for (i=0;i<512;i++)
for(j=0;j<512;j++)
fwrite(&coeff[i][j], sizeof(double), 1, cmp_file);
fclose (cmp_file);
}
void Image_BW::coecmp(void)
{
int i,j;
double cmp[144][176],m1;//512,512
FILE * cmp_file = fopen("cmpfile", "rb");
for (i=0;i<dim.x;i++)
for (j=0;j<dim.y;j++) {
fread(&cmp[i][j], sizeof(double), 1, cmp_file);
if (fabs(cmp[i][j]-coeff[i][j])>16.) {
printf("error\n");
}
}
fclose (cmp_file);
}
/*
void Image_BW::upsample(int select, int level1)
{
int i, j, mx = dim.x, my = dim.y, k=level1>>1;
double d1;
for (i = 0; i < mx; i++)
for (j = select; j < my; j+=2)
if ((d1=fabs(coeff[i][j]))<level1 && d1>=(double)k) coeff[i][j]*=2;
}
void Image_BW::decimate1(int select, int level1)
{
int i, j, i1, j1, k, Bsize=2, mx = dim.x >>level1, my = dim.y>>level1;
for (k=0; k<level1; k++) {
for (i = 0; i < mx; i+=Bsize) {
for (j = select*Bsize; j < my; j+=Bsize) {
for (i1=0; i1<Bsize; i1++) {
for (j1=0; j1<Bsize; j1++) {
coeff[i+i1][j+my+j1]=.0;
coeff[i+mx+i1][j+j1]=.0;
coeff[i+mx+i1][j+my+j1]=.0;
}
}
}
}
mx<<=1; my<<=1; Bsize<<=1;
}
}
*/
void Image_BW::coe(double gene) //把系数乘上一个常数
{
int i, j, mx = dim.x, my = dim.y;
for (i = 0; i < mx; i++)
for (j = 0; j < my; j++)
coeff[i][j]=gene*coeff[i][j];
}
void Image_BW::coeP(double gene,Pel_Type** DePcoeff)
{
int i, j, mx = dim.x, my = dim.y;
for (i = 0; i < mx; i++)
for (j = 0; j < my; j++)
DePcoeff[i][j]=gene*DePcoeff[i][j];
}
void Image_BW::coeprintf(void)
{
int i, j, mx = dim.x, my = dim.y, n;
FILE *outfile=fopen("outcoe","wb");
fprintf(outfile, " ");
for (i = 0; i < my; i++) fprintf(outfile, "%5d",i);
fprintf(outfile, "\n");
for (i = 0; i < mx; i++) {
fprintf(outfile, "%3d",i);
for (j = 0; j < my; j++) {
n=int(coeff[i][j]+.5);
fprintf(outfile, "%5d",n); }
fprintf(outfile, "\n");
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Image_BW::decimate1(int select, int level1) //对于小于level1的树枝,两树删一
{
int i, j, i1, j1, k, Bsize=2, mx = dim.x >>(levels), my = dim.y>>(levels);
for (k=0; k<levels; k++) {
for (i = 0; i < mx; i+=Bsize) {
for (j = select*Bsize; j < my; j+=Bsize) {
for (i1=0; i1<Bsize; i1++) {
for (j1=0; j1<Bsize; j1++) {
if (fabs(coeff[i+i1][j+my+j1])<level1) coeff[i+i1][j+my+j1]=.0;
if (fabs(coeff[i+mx+i1][j+j1])<level1) coeff[i+mx+i1][j+j1]=.0;
if (fabs(coeff[i+mx+i1][j+my+j1])<level1) coeff[i+mx+i1][j+my+j1]=.0;
}
}
j+=Bsize;
}
i+=Bsize;
}
mx<<=1; my<<=1; Bsize<<=1;
}
}
//-----------------------------------------------------------------------------
void Image_BW::recall(int level1)
{
int i, j;
for (i=0; i<dim.x; i++)
for (j=0; j<dim.y; j++) coeff[i][j] = coeff1[i][j];
levels = level1;
}
// end of file < Image_BW.C >
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -