⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imgprocessing.cpp

📁 直方图的相关操作
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/********************************************/
/*  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 + -