📄 imgprocessing.cpp
字号:
/********************************************/
/* functions for image processing */
/* and face detection,recognition */
/********************************************/
#include "StdAfx.h"
#include "ImgProcessing.h"
#include <cmath>
/*******************************************/
/* fuction for */
/* edge extraction using sobel operator */
/*******************************************/
//mode=0:nomal;mode=1:verticality;mode=2:Horizon
void Img_Sobel(CByteArray& imga,int height,int width,CByteArray& imgb,int mode)
{
int i,j;
int c,cc,c1;
imgb.RemoveAll();
imgb.SetSize(height*width);
for(i=1;i<height-1;i++)
for(j=1;j<width-1;j++)
{
//垂直
cc=-(int)imga[(i-1)*width+(j-1)]
-2*(int)imga[(i)*width+(j-1)]
-(int)imga[(i+1)*width+(j-1)];
cc+=(int)imga[(i-1)*width+(j+1)]
+2*(int)imga[(i)*width+(j+1)]
+(int)imga[(i+1)*width+(j+1)];
c1=abs(cc);
if(c1>255) c1=255;
if(mode==1)
{
imgb[i*width+j]=(BYTE)c1;
continue;
}
//水平
cc=(int)imga[(i-1)*width+(j-1)]
+2*(int)imga[(i-1)*width+j]
+(int)imga[(i-1)*width+(j+1)];
cc+=-(int)imga[(i+1)*width+(j-1)]
-2*(int)imga[(i+1)*width+j]
-(int)imga[(i+1)*width+j+1];
c=abs(cc);
if(c>255) c=255;
if(mode==2)
{
imgb[i*width+j]=(BYTE)c;
continue;
}
// if(c1>c) c=c1;
c=(c+c1)/2;
if(c>255) c=255;
imgb[i*width+j]=(BYTE)c;
}
}
/********************************/
/* function for */
/* histogram nomalizing */
/********************************/
void Img_Histogram(CByteArray& imga)
{
float GrayDistribut[256] ;
int i,j;
int k,gray,GrayLevel=256;
int buf=0;
int size=imga.GetSize();
for(k=0;k<GrayLevel;k++)
GrayDistribut[k]=0.0;
for(j=0;j<size;j++)
{
gray=imga[j];
GrayDistribut[gray]=GrayDistribut[gray]+1;
}
for(k=0;k<GrayLevel;k++)
GrayDistribut[k]=GrayDistribut[k]/(float)(size);
for(k=1;k<GrayLevel;k++)
GrayDistribut[k]=GrayDistribut[k]+GrayDistribut[k-1];
for(k=1;k<GrayLevel;k++)
GrayDistribut[k]=(float)floor(255.0*GrayDistribut[k]+0.5);
for(i=0;i<size;i++)
{
gray=imga[i];
imga[i]=(BYTE)GrayDistribut[gray] ;
}
return;
}
/******************************************/
/* Matrices for wavelet transformation */
/* used filter */
/******************************************/
/*Haar小波,正交小波*/
/*double h[DD]={-0.002,-0.003,0.006,0.006,-0.013,
-0.012,0.030,0.023,-0.078,-0.035,
0.307,0.542,0.307,-0.035,-0.078,
0.023,0.030,-0.012,-0.013,0.006,
0.006,-0.003,-0.002},
g[DD]={0.002,-0.003,-0.006,0.006,0.013,
-0.012,-0.030,0.023,0.078,-0.035,
-0.307,0.542,-0.307,-0.035,0.078,
0.023,-0.030,-0.012,0.013,0.006,
-0.006,-0.003,0.002},
hi[DD]={-0.002,-0.003,0.006,0.006,-0.013,
-0.012,0.030,0.023,-0.078,-0.035,
0.307,0.542,0.307,-0.035,-0.078,
0.023,0.030,-0.012,-0.013,0.006,
0.006,-0.003,-0.002},
gi[DD]={0.002,-0.003,-0.006,0.006,0.013,
-0.012,-0.030,0.023,0.078,-0.035,-0.307,
0.542,
-0.307,-0.035,0.078,0.023,-0.030,-0.012,
0.013,0.006,-0.006,-0.003,0.002};
*/
/*//有马赛克纹理
double h[DD]={-0.00332761,0.00569794,0.0196637,-0.0482603,-0.0485391,
0.292562,0.564406,0.292562,-0.0485391,-0.0482602,
-0.0196637,0.00569794,-0.00332761},
g[DD]={0.00332761,0.00569794,-0.0196637,-0.0482603,0.0485391,
0.292562,-0.564406,0.292562,0.0485391,-0.0482602,
0.0196637,0.00569794,0.00332761},
hi[DD]={-0.00332761,0.00569794,0.0196637,-0.0482603,-0.0485391,
0.292562,0.564406,0.292562,-0.0485391,-0.0482602,
-0.0196637,0.00569794,-0.00332761},
gi[DD]={0.00332761,0.00569794,-0.0196637,-0.0482603,0.0485391,
0.292562,-0.564406,0.292562,0.0485391,-0.0482602,
0.0196637,0.00569794,0.00332761};
*/
//接近正交的双正交滤波器
double h[DD]={0,0,0,0,0,
-0.003173,0.005859,0.019042,-0.048828,-0.047607,
0.292968,0.563476,0.292968,
-0.047607,-0.048828,0.019042,0.005859,-0.003173,
0,0,0,0,0},
g[DD]={-0.000025,-0.000047,0.000339,0.000736,-0.001774,
-0.005725,0.010536,0.021983,-0.055220,-0.047005,
0.296144,0.560116,0.296144,-0.047005,-0.055220,
0.021983,0.010536,-0.005725,-0.001774,0.000736,
0.000339,0.005859,-0.000025},
hi[DD]={0,0,0,0,0,
-0.003173,0.005859,0.019042,-0.048828,-0.047607,
0.292968,0.563476,0.292968,-0.047607,-0.048828,
0.019042,0.005859,-0.003173,0,0,
0,0,0},
gi[DD]={-0.000025,-0.000047,0.000339,0.000736,-0.001774,
-0.005725,0.010536,0.021983,-0.055220,-0.047005,
0.296144,0.560116,0.296144,-0.047005,-0.055220,
0.021983,0.010536,-0.005725,-0.001774,0.000736,
0.000339,0.005859,-0.000025};
//对称双正交小波
/*double h[DD]={0.007015,0.015436,0.000197,0.043244,0.242786,
0.382638,
0.242786,0.043244,0.000197,0.015436,0.007015},
g[DD]={0,0.038061,-0.083745,-0.257235,0.333745,
0.938348,
0.333745,-0.257235,-0.083745,0.038061,0},
hi[DD]={0.007015,0.015436,0.000197,0.043244,0.242786,
0.382638,
0.242786,0.043244,0.000197,0.015436,0.007015},
gi[DD]={0,0.038061,-0.083745,-0.257235,0.333745,
0.938348,
0.333745,-0.257235,-0.083745,0.038061,0};
*/
int a(int x,int xsize)
{
if(x<0) x=-x;
if(x>=xsize) x=xsize*2-x-1;
return x ;
}
double s(double x)
{
if(x>255.0) return 255.0;
if(x<-0.0) return 0.0;
return x;
}
void coef()
{
int i ;
for(i=0;i<DD;i++)
{
hi[i]=h[DD-1-i];
gi[i]=g[DD-1-i];
}
}
/**/
void Img_WaveletTransform
(CByteArray& img,int xs,int ys,DWORD xsize,DWORD ysize)
{
int i,j,k,n;
double temp1,temp2,min=65534,max=-65534,temp;
DoubleArray bufferx,buffery,buffer;
buffer.SetSize(img.GetSize());
bufferx.SetSize(xs);
buffery.SetSize(ys);
//水平方向
for(n=0;n<ys;n++)
{
for(i=0;i<xs;i+=2)
{
temp1=0;
temp2=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+h[j+(DD-1)/2]*(img[n*xsize+a((i+j),xs)]);
for(j=-(DD-1)/2+1;j<(DD-1)/2+1;j++)
temp2=temp2+g[j+(DD-1)/2-1]*(img[n*xsize+a((i+j),xs)]);
bufferx[i/2]=temp1;
bufferx[i/2+xs/2]=temp2;
}
for(k=0;k<xs;k++)
{
temp=s(bufferx[k]);
if(temp<min) min=temp;
if(temp>max) max=temp;
buffer[n*xsize+k]=temp;
}
}
Img_Quantification(buffer,img,min,max);
//垂直方向
min=655;max=-655;
for(n=0;n<xs;n++)
{
for(i=0;i<ys;i+=2)
{
temp1=0;
temp2=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+h[j+(DD-1)/2]*(img[n+xsize*a((i+j),ys)]);
for(j=-(DD-1)/2+1;j<(DD-1)/2+1;j++)
temp2=temp2+g[j+(DD-1)/2-1]*(img[n+xsize*a((i+j),ys)]);
buffery[i/2]=temp1;
buffery[i/2+ys/2]=temp2;
}
for(k=0;k<ys;k++)
{
double temp=s(buffery[k]);
if(temp>max) max=temp;
if(temp<min) min=temp;
buffer[k*xsize+n]=temp;
}
}
Img_Quantification(buffer,img,min,max);
}
/**/
void Img_InverseWaveletTransform
(CByteArray& oldimg,int xs,int ys,DWORD xsize,DWORD ysize)
{
int i,j,k,n;
double temp1,temp2,min=65534,max=-65535;
DoubleArray bufferx,buffery,buffer;
buffer.SetSize(oldimg.GetSize());
bufferx.SetSize(ys);
buffery.SetSize(ys);
// 垂直方向
for(n=0;n<xs;n++)
{
for(k=0;k<(ys/2);k++)
{
buffery[k*2]=(oldimg[k*xsize+n]);
buffery[k*2+1]=0;
}
for(i=0;i<ys;i++)
{
temp1=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+hi[j+(DD-1)/2]*buffery[a(i+j,ys)];
bufferx[i]=temp1;
}
for(k=0;k<(ys/2);k++)
{
buffery[k*2]=oldimg[(k+ys/2)*xsize+n];
buffery[k*2+1]=0;
}
for(i=0;i<ys;i++)
{
temp1=0;
for(j=-(DD-1)/2-1;j<=(DD-1)/2-1;j++)
temp1=temp1+gi[j+(DD-1)/2+1]*buffery[a(i+j,ys)];
temp2=temp1+bufferx[i];
bufferx[i]=temp2;
}
for(k=0;k<ys;k++)
{
//bufferx[k]=s(bufferx[k]);
//oldimg[k*xsize+n]=(BYTE)(bufferx[k]);
buffer[k*xsize+n]=s(bufferx[k]);
}
}
//水平方向
buffery.RemoveAll();
bufferx.RemoveAll();
buffery.SetSize(xs);
bufferx.SetSize(xs);
for(n=0;n<ys;n++)
{
for(k=0;k<(xs/2);k++)
{
bufferx[k*2]=buffer[n*xsize+k];
bufferx[k*2+1]=0;
}
for(i=0;i<xs;i++)
{
temp1=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+hi[j+(DD-1)/2]*bufferx[a(i+j,xs)];
buffery[i]=temp1;
}
for(k=0;k<(xs/2);k++)
{
bufferx[k*2]=buffer[(k+xs/2)+xsize*n];
bufferx[k*2+1]=0;
}
for(i=0;i<xs;i++)
{
temp1=0;
for(j=-(DD-1)/2-1;j<=(DD-1)/2-1;j++)
temp1=temp1+gi[j+(DD-1)/2+1]*bufferx[a(i+j,xs)];
temp2=temp1+buffery[i];
buffery[i]=temp2;
}
for(k=0;k<xs;k++)
{
//buffery[k]=s(buffery[k]);
double x=buffery[k];
if(x<min) min=x;
if(x>max) max=x;
buffer[k+xsize*n]=s(x);
//oldimg[k+xsize*n]=s(x);
}
}
Img_Quantification(buffer,oldimg,min,max);
}
void Img_Quantification(DoubleArray& imga,CByteArray& imgb,double& min,double& max)
{
int size;
size=imga.GetSize();
imgb.SetSize(size);
for(int i=0;i<size;i++)
{
imgb[i]=(BYTE)((imga[i]-min)/(max-min)*255.0);
}
}
void Img_Quantification(DoubleArray& imga,CByteArray& imgb)
{
int size;
double max,min;
max=min=imga[0];
size=imga.GetSize();
imgb.SetSize(size);
int i;
for(i=0;i<size;i++)
{
if(imga[i]<min) min=imga[i];
if(imga[i]>max) max=imga[i];
}
for(i=0;i<size;i++)
{
imgb[i]=(BYTE)((imga[i]-min)/(max-min)*255.0);
}
}
void Img_Quantification(CByteArray& imga,CByteArray& imgb)
{
int size,i,max=0,min=256;
size=imga.GetSize();
imgb.SetSize(size);
for(i=0;i<size;i++)
{
if(imga[i]<min) min=imga[i];
if(imga[i]>max) max=imga[i];
}
for(i=0;i<size;i++)
{
imgb[i]=(BYTE)((double)(imga[i]-min)/(double)(max-min)*255.0);
}
}
/*
void Img_WaveletTransform
(CByteArray& oldimg,int xs,int ys,DWORD xsize,DWORD ysize)
{
int i,j,k,n;
double temp1,temp2;
DoubleArray bufferx,buffery;
bufferx.SetSize(xs);
buffery.SetSize(ys);
for(n=0;n<ys;n++)
{
for(i=0;i<xs;i+=2)
{
temp1=0;
temp2=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+h[j+(DD-1)/2]*(oldimg[n*xsize+a((i+j),xs)]-128);
for(j=-(DD-1)/2+1;j<(DD-1)/2+1;j++)
temp2=temp2+g[j+(DD-1)/2-1]*(oldimg[n*xsize+a((i+j),xs)]-128);
bufferx[i/2]=temp1;
bufferx[i/2+xs/2]=temp2;
}
for(k=0;k<xs;k++)
{
bufferx[k]=s(bufferx[k]);
oldimg[n*xsize+k]=(BYTE)(bufferx[k]+128);
}
}
for(n=0;n<xs;n++)
{
for(i=0;i<ys;i+=2)
{
temp1=0;
temp2=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+h[j+(DD-1)/2]*(oldimg[n+xsize*a((i+j),ys)]-128.0);
for(j=-(DD-1)/2+1;j<(DD-1)/2+1;j++)
temp2=temp2+g[j+(DD-1)/2-1]*(oldimg[n+xsize*a((i+j),ys)]-128.0);
buffery[i/2]=temp1;
buffery[i/2+ys/2]=temp2;
}
for(k=0;k<ys;k++)
{
buffery[k]=s(buffery[k]);
oldimg[k*xsize+n]=(BYTE)(buffery[k]+128.0);
}
}
}
void Img_InverseWaveletTransform
(CByteArray& oldimg,int xs,int ys,DWORD xsize,DWORD ysize)
{
int i,j,k,n;
double temp1,temp2;
DoubleArray bufferx,buffery;
bufferx.SetSize(ys);
buffery.SetSize(ys);
for(n=0;n<xs;n++)
{
for(k=0;k<(ys/2);k++)
{
buffery[k*2]=(oldimg[k*xsize+n]-128.0);
buffery[k*2+1]=0;
}
for(i=0;i<ys;i++)
{
temp1=0;
for(j=-(DD-1)/2;j<=(DD-1)/2;j++)
temp1=temp1+hi[j+(DD-1)/2]*buffery[a(i+j,ys)];
bufferx[i]=temp1;
}
for(k=0;k<(ys/2);k++)
{
buffery[k*2]=oldimg[(k+ys/2)*xsize+n]-128.0;
buffery[k*2+1]=0;
}
for(i=0;i<ys;i++)
{
temp1=0;
for(j=-(DD-1)/2-1;j<=(DD-1)/2-1;j++)
temp1=temp1+gi[j+(DD-1)/2+1]*buffery[a(i+j,ys)];
temp2=temp1+bufferx[i];
bufferx[i]=temp2;
}
for(k=0;k<ys;k++)
{
bufferx[k]=s(bufferx[k]);
oldimg[k*xsize+n]=(BYTE)(bufferx[k]+128 );
}
}
buffery.RemoveAll();
bufferx.RemoveAll();
buffery.SetSize(xs);
bufferx.SetSize(xs);
for(n=0;n<ys;n++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -