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

📄 bip.cpp

📁 变化检测源程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Bip.cpp: implementation of the CBip class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Bip.h"
#include <math.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CBip::CBip()
{

}

CBip::~CBip()
{

}


//////灰度求反:图像数据,波段数,宽度,高度,处理波段
BOOL CBip::InvertData(BYTE *lpbuf, int bonum, int w, int h,int bons)
{
	BYTE **originimage;
	int i,j;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	    originimage[i][j*bonum+bons-1]=255-originimage[i][j*bonum+bons-1];
	delete [] originimage;
	return TRUE;
}

//////灰度二值化:图像数据,波段数,宽度,高度,处理波段,门限
BOOL CBip::BiValue(BYTE *lpbuf, int bonum, int w, int h, int bons, int threshold)
{	BYTE **originimage;
	int i,j;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		if(originimage[i][j*bonum+bons-1]>threshold)
			originimage[i][j*bonum+bons-1]=255;
		else
			originimage[i][j*bonum+bons-1]=0;
	}
	delete [] originimage;
	return TRUE;
}

//////图像水平翻转:图像数据,波段数,宽度,高度,处理波段
BOOL CBip::HorzMirror(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
		lpTemp[i*w+j]=originimage[i][(w-j-1)*bonum+bons-1];
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete lpTemp;
	delete [] originimage;

	return TRUE;

}
//////图像垂直翻转:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::VertMirror(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
		lpTemp[i*w+j]=originimage[h-i-1][j*bonum+bons-1];
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete lpTemp;
	delete [] originimage;
	return TRUE;

}
//////图像水平投影:图像数据,波段数,宽度,高度,处理波段
BOOL CBip::ProjHorz(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,num;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(i=0;i<h;i++)
	{
		num=0;
		for(j=0;j<w;j++)
			if(originimage[i][j*bonum+bons-1]==255)
			{
				num++;
				originimage[i][j*bonum+bons-1]=0;
			}
		for(j=0;j<num;j++)
			originimage[i][j*bonum+bons-1]=255;
			
	}
	delete [] originimage;
	return TRUE;
}
//////图像垂直投影:图像数据,波段数,宽度,高度,处理波段
BOOL CBip::ProjVert(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,num;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(j=0;j<w;j++)
	{
		num=0;
		for(i=0;i<h;i++)
			if(originimage[i][j*bonum+bons-1]==255)
			{
				num++;
				originimage[i][j*bonum+bons-1]=0;
			}
		for(i=num;i<h;i++)
			originimage[i][j*bonum+bons-1]=255;
			
	}
	delete [] originimage;
	return TRUE;

}
//////图像直方图均衡:图像数据,波段数,宽度,高度,处理波段
BOOL CBip::HistogramEq(BYTE *lpbuf, int bonum, int w, int h, int bons)
{	
	BYTE **originimage;
	int i,j,tem;
	long data[256];
	long s[256];
	for(i=0;i<256;i++)
	{
		data[i]=0;
		s[i]=0;
	}

	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		tem=originimage[i][j*bonum+bons-1];
		data[tem]++;
	}

	s[0]=data[0];
	for(i=1;i<256;i++)
	{
		s[i]=s[i-1];
		s[i]+=data[i];
	}
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		tem=originimage[i][j*bonum+bons-1];
		originimage[i][j*bonum+bons-1]=s[tem]*255/w/h;

	}	
	
	delete [] originimage;

	return TRUE;

}
//////求图像最大灰度值:图像数据,波段数,宽度,高度,处理波段
int CBip::MaxData(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,max;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	max=0;	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
			if(originimage[i][j*bonum+bons-1]>max)
			{
				max=originimage[i][j*bonum+bons-1];
			}
	delete [] originimage;
	return max;

}
//////求图像最小灰度值:图像数据,波段数,宽度,高度,处理波段

int CBip::MinData(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,min;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	min=255;	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
			if(originimage[i][j*bonum+bons-1]<min)
			{
				min=originimage[i][j*bonum+bons-1];
			}
	delete [] originimage;
	return min;

}
//////图像33均值滤波:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::Mean33(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,sun;
	int x1,y1;
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
	{
		sun=0;
		for(y1=-1;y1<=1;y1++)
		for(x1=-1;x1<=1;x1++)
			sun+=originimage[i+y1][(j+x1)*bonum+bons-1];
		lpTemp[i*w+j]=(int)(sun/9);
	}	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete [] originimage;
	return TRUE;

}
//////图像55均值滤波:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::Mean55(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,sun;
	int x1,y1;
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=2;i<h-2;i++)
	for(j=2;j<w-2;j++)
	{
		sun=0;
		for(y1=-2;y1<=2;y1++)
		for(x1=-2;x1<=2;x1++)
			sun+=originimage[i+y1][(j+x1)*bonum+bons-1];
		lpTemp[i*w+j]=(int)(sun/25);
	}	
	for(i=2;i<h-2;i++)
	for(j=2;j<w-2;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete [] originimage;
	return TRUE;

}
//////图像33滤波:图像数据,波段数,宽度,高度,处理波段,输出第几大

BOOL CBip::Sort33(BYTE *lpbuf, int bonum, int w, int h, int bons, int in)
{
	BYTE **originimage;
	int i,j,x,y;
	int P[9],s;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
	{
		P[0]=originimage[i-1][(j-1)*bonum+bons-1];
		P[1]=originimage[i][(j-1)*bonum+bons-1];
		P[2]=originimage[i+1][(j-1)*bonum+bons-1];
		P[3]=originimage[i-1][j*bonum+bons-1];
		P[4]=originimage[i][j*bonum+bons-1];
		P[5]=originimage[i+1][j*bonum+bons-1];
		P[6]=originimage[i-1][(j+1)*bonum+bons-1];
		P[7]=originimage[i][(j+1)*bonum+bons-1];
		P[8]=originimage[i+1][(j+1)*bonum+bons-1];
		for(x=0;x<5;x++)
		for(y=x+1;y<9;y++)
			if (P[y]>P[x])
					{
						s=P[y];
						P[y]=P[x];
						P[x]=s;
					}
				
		lpTemp[i*w+j]=P[in];
	}	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete [] originimage;
	return TRUE;

}
//////图像自己定义33滤波:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::Filter33(BYTE *lpbuf, int *a, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,sun,he;
	int x1,y1;
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	BYTE *lpTemp=new BYTE[w*h];
	
	he=0;
	for(i=0;i<9;i++)
		he+=*(a+1);
	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
	{
		sun=0;
		for(y1=-1;y1<=1;y1++)
		for(x1=-1;x1<=1;x1++)
		{
			sun+=(*(a+3*(y1+1)+x1+1))*originimage[i+y1][(j+x1)*bonum+bons-1];
			
		}
		if(he>0)
			lpTemp[i*w+j]=(int)(sun/he);
		else
			lpTemp[i*w+j]=sun;
	}	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete [] originimage;
	return TRUE;

}
//////图像自己定义33滤波:图像数据,波段数,宽度,高度,处理波段,输出第几大

BOOL CBip::FilterSort33(BYTE *lpbuf, int *a, int bonum, int w, int h, int bons, int in)
{
	BYTE **originimage;
	int i,j,x,y;
	int P[9],s;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	BYTE *lpTemp=new BYTE[w*h];
	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
	{
		P[0]=originimage[i-1][(j-1)*bonum+bons-1]*(*a);
		P[1]=originimage[i][(j-1)*bonum+bons-1]*(*(a+3));
		P[2]=originimage[i+1][(j-1)*bonum+bons-1]*(*(a+6));
		P[3]=originimage[i-1][j*bonum+bons-1]*(*(a+1));
		P[4]=originimage[i][j*bonum+bons-1]*(*(a+4));
		P[5]=originimage[i+1][j*bonum+bons-1]*(*(a+7));
		P[6]=originimage[i-1][(j+1)*bonum+bons-1]*(*(a+2));
		P[7]=originimage[i][(j+1)*bonum+bons-1]*(*(a+5));
		P[8]=originimage[i+1][(j+1)*bonum+bons-1]*(*(a+8));
		for(x=0;x<5;x++)
		for(y=x+1;y<9;y++)
			if (P[y]>P[x])
					{
						s=P[y];
						P[y]=P[x];
						P[x]=s;
					}
				
		lpTemp[i*w+j]=P[in];
	}	
	for(i=1;i<h-1;i++)
	for(j=1;j<w-1;j++)
		originimage[i][j*bonum+bons-1]=lpTemp[i*w+j];
	delete [] originimage;
	return TRUE;

}
//////图像直方图数据:图像数据,波段数,宽度,高度,处理波段

long * CBip::HistogramData(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,s;
	long data[256];
	for(i=0;i<256;i++)
		data[i]=0;

	long *p=data;
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		s=originimage[i][j*bonum+bons-1];
		data[s]++;
	}
	delete [] originimage;
	return p;
}
//////图像拉伸到0-255:图像数据,最大灰度,最小灰度,波段数,宽度,高度,处理波段

BOOL CBip::To0255(BYTE *lpbuf,int max,int min, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j,s;
	
	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;

	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		s=originimage[i][j*bonum+bons-1];
		originimage[i][j*bonum+bons-1]=(int)(255*(s-min)/(max-min));
	}		
	delete [] originimage;
	return max;
}
//////图像加入随机噪声:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::RandomNoise(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j;
	int NoisePoint;
	srand((unsigned)time(NULL));

	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	{
		NoisePoint=rand()/1024;
	    originimage[i][j*bonum+bons-1]=originimage[i][j*bonum+bons-1]*224/256+ NoisePoint;
	}
	delete [] originimage;
	return TRUE;

}
//////图像加入椒盐噪声:图像数据,波段数,宽度,高度,处理波段

BOOL CBip::SaltNoise(BYTE *lpbuf, int bonum, int w, int h, int bons)
{
	BYTE **originimage;
	int i,j;
	srand((unsigned)time(NULL));

	originimage=new BYTE*[h];
	for(i=0;i<h;i++)
			originimage[i]=lpbuf+i*bonum*w;
	
	for(i=0;i<h;i++)
	for(j=0;j<w;j++)
	if(rand()>31500)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -