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

📄 图像增强技术doc.cpp

📁 哥们图像增强技术的毕业设计
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	// TODO: Add your command handler code here

	//该函数用于实现对图像进行拉普拉斯锐化

    LPBYTE Temp;
    HLOCAL New;
    long Width=(m_size.cx*8+31)/32*4;
    New=LocalAlloc(LHND,Width*m_size.cy);
	if(New==NULL)
	{
		 MessageBox(NULL,"False!","flase",MB_OK);

	}
	Temp=(BYTE*)LocalLock(New);
	memcpy(Temp,lpBits,Width*m_size.cy);

	long i,j;
	float ave;
	int M_iYinzi[3][3]={-1,-1,-1,-1,9,-1,-1,-1,-1},m,n;
	
	for(i=1;i<m_size.cy-1;i++)
	{
		for(j=1;j<Width-1;j++)
		{
			ave=0;
			for(n=0;n<3;n++)
			{
				for(m=0;m<3;m++)
				{
					ave+=M_iYinzi[n][m]*Temp[(i-1+n)*Width+(j-1)+m];
				}
			}
			
			if(abs((int)(ave+0.5))>255)
			{
				lpBits[i*m_size.cx+j]=255;
			}
			else
			{
			    lpBits[i*m_size.cx+j]=abs((int)(ave+0.5));
			}
		}
	}
	UpdateAllViews(NULL);
    SetModifiedFlag();
	LocalUnlock(Temp);
	LocalFree(Temp);
}
//15.对图像进行拉普拉斯锐化函数代码完毕

void CMyDoc::OnCopynonoiseimage() 
{
	// TODO: Add your command handler code here
	//该函数用于复制无噪图像

	//循环变量
	long i,j;
    lpTempDIB=new unsigned char[m_size.cy*(8*m_size.cx+31)/32*4];
	for(j=0;j<m_size.cy;j++)
	{
		for(i=0;i<(8*m_size.cx+31)/32*4;i++)
		{
			lpTempDIB[j*(8*m_size.cx+31)/32*4+i]=lpBits[j*(8*m_size.cx+31)/32*4+i];
		}
	}
	
}
//16.复制无噪图像函数代码完毕

void CMyDoc::FFT(double *TD1, double *TD2, double *FD1, double *FD2, int r)
{
    //该函数用于对图像进行傅立叶变换

	// 付立叶变换点数
	LONG count=1<<r;
	// 循环变量
	int		i,j,k;
	// 中间变量
	int		bfsize,p;
	// 角度
	double	angle;
	
	double *W1,*W2,*X11,*X12,*X21,*X22,*X1,*X2;
	
	// 分配运算所需存储器
	W1  = new double[count / 2];
    W2  = new double[count / 2];
	X11 = new double[count];
	X12 = new double[count];
	X21 = new double[count];
	X22 = new double[count];
	
	// 计算加权系数
	for(i = 0; i < count / 2; i++)
	{
		angle = -i * 3.1415926535 * 2 / count;
		W1[i]=double(cos(angle));
		W2[i]=double(sin(angle));
	}
	
	// 将时域点写入X1
	memcpy(X11, TD1, sizeof(double) * count);
	memcpy(X12, TD2, sizeof(double) * count);
	
	// 采用蝶形算法进行快速付立叶变换
	for(k = 0; k < r; k++)
	{
		for(j = 0; j < 1 << k; j++)
		{
			bfsize = 1 << (r-k);
			for(i = 0; i < bfsize / 2; i++)
			{
				p = j * bfsize;
				X21[i + p] = X11[i + p] + X11[i + p + bfsize / 2];
                X22[i + p] = X12[i + p] + X12[i + p + bfsize / 2];
				X21[i + p + bfsize / 2] = (X11[i + p] - X11[i + p + bfsize / 2]) * W1[i * (1<<k)]
					                      -(X12[i + p] - X12[i + p + bfsize / 2]) * W2[i * (1<<k)];
                X22[i + p + bfsize / 2] = (X11[i + p] - X11[i + p + bfsize / 2]) * W2[i * (1<<k)]
					                      +(X12[i + p] - X12[i + p + bfsize / 2]) * W1[i * (1<<k)];

			}
		}
		X1  = X11;
		X2  = X12;
		X11 = X21;
		X12 = X22;
		X21 = X1;
		X22 = X2;
	}
	
	// 重新排序
	for(j = 0; j < count; j++)
	{
		p = 0;
		for(i = 0; i < r; i++)
		{
			if (j&(1<<i))
			{
				p+=1<<(r-i-1);
			}
		}
		FD1[j]=X11[p];
		FD2[j]=X12[p];
	}
	
	// 释放内存
	delete W1;
	delete W2;
	delete X11;
	delete X12;
	delete X21;
	delete X22;
}
//17.对图像进行傅立叶变换函数代码完毕

void CMyDoc::OnFft() 
{
	// TODO: Add your command handler code here
	//该函数用于调用傅立叶变换函数

	// 中间变量
	double	dTemp;	
	// 循环变量
	LONG	i,j;

	// 进行付立叶变换的宽度和高度(2的整数次方)
	LONG	w,h;
	int		wp,hp;
	// 图像每行的字节数
	LONG	lLineBytes=(8*m_size.cx+31)/32*4;
	// 赋初值
	w = 1;
	h = 1;
	wp = 0;
	hp = 0;
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= m_size.cx)
	{
		w *= 2;
		wp++;
	}
	
	while(h * 2 <= m_size.cy)
	{
		h *= 2;
		hp++;
	}
	
	// 分配内存
	double *TD1 = new double[w * h];
	double *TD2 = new double[w * h];
	double *FD1 = new double[w * h];
	double *FD2 = new double[w * h];

	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{		
			// 给时域赋值
			TD1[j + w * i] = lpBits[i*lLineBytes+j];
			TD2[j + w * i] = 0;
		}
	}
	
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶变换
		FFT(&TD1[w * i], &TD2[w * i],&FD1[w * i],&FD2[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			TD1[i + h * j] = FD1[j + w * i];
			TD2[i + h * j] = FD2[j + w * i];
		}
	}
	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶变换
		FFT(&TD1[i * h],&TD2[i * h],&FD1[i * h], &FD2[i * h], hp);
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			// 计算频谱
			dTemp = sqrt(FD1[j * h + i] * FD1[j * h + i] + 
				         FD2[j * h + i] * FD2[j * h + i]) / 100;
			
			// 判断是否超过255
			if (dTemp > 255)
			{
				// 对于超过的,直接设置为255
				dTemp = 255;
			}
			
			// 指向DIB第(i<h/2 ? i+h/2 : i-h/2)行,第(j<w/2 ? j+w/2 : j-w/2)个象素的指针
			// 此处不直接取i和j,是为了将变换后的原点移到中心
			// 更新源图像
			lpBits[(i<h/2 ? i+h/2 : i-h/2)/*)*/*lLineBytes 
				+ (j<w/2 ? j+w/2 : j-w/2)] = (BYTE)(dTemp);
		//	lpBits[i*lLineBytes+j]=(BYTE)(dTemp);
		}
	}
	FFD1=FD1;
	FFD2=FD2;
	// 删除临时变量
	delete TD1;
	delete TD2;
//	delete FD1;
//	delete FD2;

	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}
//18.调用傅立叶变换函数代码完毕

void CMyDoc::IFFT(double *FD1, double *FD2, double *TD1, double *TD2, int r)
{
	//该函数用于对傅立叶变换后的图像进行反变换

    // 付立叶变换点数
	LONG	count=1<<r;
    // 循环变量
	int		i;
	
	double *X1,*X2;

	// 分配运算所需存储器
	X1 = new double[count];
	X2 = new double[count];
	
	// 将频域点写入X
	memcpy(X1, FD1, sizeof(double) * count);
	memcpy(X2, FD2, sizeof(double) * count);
	
	// 求共轭
	for(i = 0; i < count; i++)
	{
		X1[i] = X1[i];
		X2[i] = -X2[i];
	}
	
	// 调用快速付立叶变换
	FFT(X1,X2,TD1,TD2, r);
	
	// 求时域点的共轭
	for(i = 0; i < count; i++)
	{
		TD1[i] = TD1[i] / count;
		TD2[i] = -TD2[i] / count;
	}
	
	// 释放内存
	delete X1;
	delete X2;
}
//19.对傅立叶变换后的图像进行反变换函数代码完毕

void CMyDoc::OnIfft() 
{
	// TODO: Add your command handler code here
	//该函数用于调用傅立叶反变换

	// 中间变量
	double	dTemp;	
	// 循环变量
	LONG	i,j;

	// 进行付立叶变换的宽度和高度(2的整数次方)
	LONG	w,h;
	int		wp,hp;
	// 图像每行的字节数
	LONG	lLineBytes=(8*m_size.cx+31)/32*4;
	// 赋初值
	w = 1;
	h = 1;
	wp = 0;
	hp = 0;
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= m_size.cx)
	{
		w *= 2;
		wp++;
	}
	
	while(h * 2 <= m_size.cy)
	{
		h *= 2;
		hp++;
	}
	
	// 分配内存
	double *TD1 = new double[w * h];
	double *TD2 = new double[w * h];
	double *FD1 = new double[w * h];
	double *FD2 = new double[w * h];

	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{		
			// 给频域赋值
			FD1[j + w * i] = FFD1[j+w*i];
			FD2[j + w * i] = FFD2[j+w*i];
		}
	}
	
	for(i = 0; i < w; i++)
	{
		// 对x方向进行快速付立叶反变换
		IFFT(&FD1[h * i], &FD2[h * i],&TD1[h * i],&TD2[h * i], hp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			FD1[i + h * j] = TD1[j + w * i];
			FD2[i + h * j] = TD2[j + w * i];
		}
	}
	
	for(i = 0; i < h; i++)
	{
		// 对x方向进行快速付立叶反变换
		IFFT(&FD1[i * w],&FD2[i * w],&TD1[i * w], &TD2[i * w], wp);
	}
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{
			//计算灰度值
			dTemp = sqrt(TD1[j * h + i] * TD1[j * h + i] + 
				         TD2[j * h + i] * TD2[j * h + i]);
			
			// 判断是否超过255
			if (dTemp > 255)
			{
				// 对于超过的,直接设置为255
				dTemp = 255;
			}
			
			// 更新源图像
			lpBits[j*lLineBytes+i/*i*lLineBytes + j*/] = (BYTE)(dTemp);
		}
	}
	delete TD1;
	delete TD2;
	delete FD1;
	delete FD2;

	UpdateAllViews(NULL);
	SetModifiedFlag();
}
//20.调用傅立叶反变换函数代码完毕

void CMyDoc::OnInteequalize() 
{
	// TODO: Add your command handler code here
	
	//Db=最大灰度值/图象面积*((i=0~Da)∑各灰度值个数);Da代表灰度级。
	long i,j;//循环变量;

	int bMap[256];//存放灰度的映射表;

	long lCount[256];//存放各个灰度值个数;

	long width;//图象的宽度;
	width=(m_size.cx*8+31)/32*4;
	//计算各个灰度值个数;
	for(i=0;i<256;i++)
	{
		lCount[i]=0;
	}
	for(i=0;i<m_size.cy;i++)
	{
		for(j=0;j<width;j++)
			lCount[lpBits[i*width+j]]++;
	}
	//求映射表中各个灰度的值;
	long temp;
	for(i=0;i<256;i++)
	{
		temp=0;
		for(j=0;j<i;j++)
		{
			temp+=lCount[j];
		}
		bMap[i]=(int)(temp*255/width/m_size.cy);
	}
	//重新赋值;
	for(i=0;i<m_size.cy;i++)
	{
		for(j=0;j<width;j++)
		{
			lpBits[i*width+j]=bMap[lpBits[i*width+j]];
		}
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
	
}
//21.灰度均衡代码完毕。


void CMyDoc::HightFilterFFT()
{
	//该函数用于对图像进行高通傅立叶变换

	// 中间变量
	double	dTemp;	
	// 循环变量
	LONG	i,j;

	// 进行付立叶变换的宽度和高度(2的整数次方)
	LONG	w,h;
	int		wp,hp;
	// 图像每行的字节数
	LONG	lLineBytes=(8*m_size.cx+31)/32*4;
	// 赋初值
	w = 1;
	h = 1;
	wp = 0;
	hp = 0;
	
	// 计算进行付立叶变换的宽度和高度(2的整数次方)
	while(w * 2 <= m_size.cx)
	{
		w *= 2;
		wp++;
	}
	
	while(h * 2 <= m_size.cy)
	{
		h *= 2;
		hp++;
	}
	
	// 分配内存
	double *TD1 = new double[w * h];
	double *TD2 = new double[w * h];
	double *FD1 = new double[w * h];
	double *FD2 = new double[w * h];

	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{		
			// 给时域赋值
			TD1[j + w * i] = lpBits[i*lLineBytes+j];
			TD2[j + w * i] = 0;
		}
	}
	
	for(i = 0; i < h; i++)
	{
		// 对y方向进行快速付立叶变换
		FFT(&TD1[w * i], &TD2[w * i],&FD1[w * i],&FD2[w * i], wp);
	}
	
	// 保存变换结果
	for(i = 0; i < h; i++)
	{
		for(j = 0; j < w; j++)
		{

⌨️ 快捷键说明

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