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

📄 restore.cpp

📁 vc++数字图像处理 ,是一本很不错的介绍数字图像方面的书籍,这里有本书的全部源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ************************************************************************//  文件名:restore.cpp////  图像复原API函数库:////  BlurDIB()			- 图像模糊//  InverseDIB()	    - 图像逆滤波//  NoiseBlurDIB()		- 图像模糊加噪//  WienerDIB()			- 图像维纳滤波//	RandomNoiseDIB()	- 图像中加入随机噪声//	SaltNoiseDIB()		- 图像中加入椒盐噪声//  fourn()				- n维FFT//// *************************************************************************#include "stdafx.h"#include "restore.h"#include "DIBAPI.h"#include <math.h>#include <direct.h>#define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr/************************************************************************* * * 函数名称: *   BlurDIB() * * 参数: *   LPSTR lpDIBBits    - 指向源DIB图像指针 *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数) *   LONG  lHeight      - 源图像高度(象素数) * * 返回值: *   BOOL               - 平移成功返回TRUE,否则返回FALSE。 * * 说明: *   该函数用来对DIB图像进行模糊操作。 * ************************************************************************/BOOL WINAPI BlurDIB (LPSTR lpDIBBits, LONG lWidth, LONG lHeight){	// 指向源图像的指针	LPSTR	lpSrc;		//循环变量	long i;	long j;	//像素值	unsigned char pixel;	// 图像每行的字节数	LONG lLineBytes;	//用于做FFT的数组	double *fftSrc,*fftKernel;	//二维FFT的长度和宽度	unsigned long nn[3];	//图像归一化因子	double MaxNum;	// 计算图像每行的字节数	lLineBytes = WIDTHBYTES(lWidth * 8);	double dPower = log((double)lLineBytes)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	dPower = log((double)lHeight)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	fftSrc = new double [lHeight*lLineBytes*2+1];	fftKernel = new double [lHeight*lLineBytes*2+1];	nn[1] = lHeight;	nn[2] = lLineBytes;	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			// 指向源图像倒数第j行,第i个象素的指针						lpSrc = (char *)lpDIBBits + lLineBytes * j + i;				pixel = (unsigned char)*lpSrc;			fftSrc[(2*lLineBytes)*j + 2*i + 1] = (double)pixel;			fftSrc[(2*lLineBytes)*j + 2*i + 2] = 0.0;				if(i < 5 && j < 5)			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 1/25.0;			}			else			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 0.0;			}			fftKernel[(2*lLineBytes)*j + 2*i + 2] = 0.0;		}	}	//对源图像进行FFT	fourn(fftSrc,nn,2,1);	//对卷积核图像进行FFT	fourn(fftKernel,nn,2,1);	//频域相乘	for (i = 1;i <lHeight*lLineBytes*2;i+=2)	{		fftSrc[i] = fftSrc[i] * fftKernel[i] - fftSrc[i+1] * fftKernel[i+1];		fftSrc[i+1] = fftSrc[i] * fftKernel[i+1] + fftSrc[i+1] * fftKernel[i];	}	//对结果图像进行反FFT	fourn(fftSrc,nn,2,-1);	//确定归一化因子	MaxNum = 0.0;	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			fftSrc[(2*lLineBytes)*j + 2*i + 1] = 				sqrt(fftSrc[(2*lLineBytes)*j + 2*i + 1] * fftSrc[(2*lLineBytes)*j + 2*i + 1]\						+fftSrc[(2*lLineBytes)*j + 2*i + 2] * fftSrc[(2*lLineBytes)*j + 2*i + 2]);			if( MaxNum < fftSrc[(2*lLineBytes)*j + 2*i + 1])				MaxNum = fftSrc[(2*lLineBytes)*j + 2*i + 1];		}	}		//转换为图像	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			// 指向源图像倒数第j行,第i个象素的指针						lpSrc = (char *)lpDIBBits + lLineBytes * j + i;				*lpSrc = (unsigned char) (fftSrc[(2*lLineBytes)*j + 2*i + 1]*255.0/MaxNum);		}	}	delete fftSrc;	delete fftKernel;	// 返回	return true;}/************************************************************************* * * 函数名称: *   RestoreDIB() * * 参数: *   LPSTR lpDIBBits    - 指向源DIB图像指针 *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数) *   LONG  lHeight      - 源图像高度(象素数) * * 返回值: *   BOOL               - 平移成功返回TRUE,否则返回FALSE。 * * 说明: *   该函数用来对BlurDIB()生成的DIB图像进行复原操作。 * ************************************************************************/BOOL WINAPI RestoreDIB (LPSTR lpDIBBits, LONG lWidth, LONG lHeight){	// 指向源图像的指针	LPSTR	lpSrc;		//循环变量	long i;	long j;	//像素值	unsigned char pixel;	// 图像每行的字节数	LONG lLineBytes;	//用于做FFT的数组	double *fftSrc,*fftKernel;	double a,b,c,d;	//二维FFT的长度和宽度	unsigned long nn[3];	//图像归一化因子	double MaxNum;	// 计算图像每行的字节数	lLineBytes = WIDTHBYTES(lWidth * 8);	double dPower = log((double)lLineBytes)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	dPower = log((double)lHeight)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	fftSrc = new double [lHeight*lLineBytes*2+1];	fftKernel = new double [lHeight*lLineBytes*2+1];	nn[1] = lHeight;	nn[2] = lLineBytes;	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			// 指向源图像倒数第j行,第i个象素的指针						lpSrc = (char *)lpDIBBits + lLineBytes * j + i;				pixel = (unsigned char)*lpSrc;			fftSrc[(2*lLineBytes)*j + 2*i + 1] = (double)pixel;			fftSrc[(2*lLineBytes)*j + 2*i + 2] = 0.0;				if(i < 5 && j == 0)			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 1/5.0;			}			else			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 0.0;			}			fftKernel[(2*lLineBytes)*j + 2*i + 2] = 0.0;		}	}	//对源图像进行FFT	fourn(fftSrc,nn,2,1);	//对卷积核图像进行FFT	fourn(fftKernel,nn,2,1);	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			a = fftSrc[(2*lLineBytes)*j + 2*i + 1];			b = fftSrc[(2*lLineBytes)*j + 2*i + 2];			c = fftKernel[(2*lLineBytes)*j + 2*i + 1];			d = fftKernel[(2*lLineBytes)*j + 2*i + 2];			if (c*c + d*d > 1e-3)			{				fftSrc[(2*lLineBytes)*j + 2*i + 1] = ( a*c + b*d ) / ( c*c + d*d );				fftSrc[(2*lLineBytes)*j + 2*i + 2] = ( b*c - a*d ) / ( c*c + d*d );			}		}	}	//对结果图像进行反FFT	fourn(fftSrc,nn,2,-1);	//确定归一化因子	MaxNum = 0.0;	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			fftSrc[(2*lLineBytes)*j + 2*i + 1] = 				sqrt(fftSrc[(2*lLineBytes)*j + 2*i + 1] * fftSrc[(2*lLineBytes)*j + 2*i + 1]\						+fftSrc[(2*lLineBytes)*j + 2*i + 2] * fftSrc[(2*lLineBytes)*j + 2*i + 2]);			if( MaxNum < fftSrc[(2*lLineBytes)*j + 2*i + 1])				MaxNum = fftSrc[(2*lLineBytes)*j + 2*i + 1];		}	}		//转换为图像	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			// 指向源图像倒数第j行,第i个象素的指针						lpSrc = (char *)lpDIBBits + lLineBytes * j + i;			*lpSrc = (unsigned char) (fftSrc[(2*lLineBytes)*j + 2*i + 1]*255.0/MaxNum);		}	}	delete fftSrc;	delete fftKernel;	// 返回	return true;}/************************************************************************* * * 函数名称: *   NoiseBlurDIB() * * 参数: *   LPSTR lpDIBBits    - 指向源DIB图像指针 *   LONG  lWidth       - 源图像宽度(象素数) *   LONG  lHeight      - 源图像高度(象素数) * * 返回值: *   BOOL               - 模糊加噪操作成功返回TRUE,否则返回FALSE。 * * 说明: *   该函数用来对DIB图像进行模糊加噪操作。 * ************************************************************************/BOOL WINAPI NoiseBlurDIB (LPSTR lpDIBBits, LONG lWidth, LONG lHeight){	// 指向源图像的指针	LPSTR	lpSrc;		//循环变量	long i;	long j;	//像素值	unsigned char pixel;	// 图像每行的字节数	LONG lLineBytes;	//用于做FFT的数组	double *fftSrc,*fftKernel;	//二维FFT的长度和宽度	unsigned long nn[3];	//图像归一化因子	double MaxNum;	// 计算图像每行的字节数	lLineBytes = WIDTHBYTES(lWidth * 8);	double dPower = log((double)lLineBytes)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	dPower = log((double)lHeight)/log(2.0);	if(dPower != (int) dPower)	{		return false;	}	fftSrc = new double [lHeight*lLineBytes*2+1];	fftKernel = new double [lHeight*lLineBytes*2+1];	nn[1] = lHeight;	nn[2] = lLineBytes;	for (j = 0;j < lHeight ;j++)	{		for(i = 0;i < lLineBytes ;i++)		{			// 指向源图像倒数第j行,第i个象素的指针						lpSrc = (char *)lpDIBBits + lLineBytes * j + i;				pixel = (unsigned char)*lpSrc;			fftSrc[(2*lLineBytes)*j + 2*i + 1] = (double)pixel;			fftSrc[(2*lLineBytes)*j + 2*i + 2] = 0.0;				if(i < 5 && j == 0)			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 1/5.0;			}			else			{				fftKernel[(2*lLineBytes)*j + 2*i + 1] = 0.0;			}			fftKernel[(2*lLineBytes)*j + 2*i + 2] = 0.0;		}	}	//对源图像进行FFT	fourn(fftSrc,nn,2,1);	//对卷积核图像进行FFT	fourn(fftKernel,nn,2,1);	//频域相乘	for (i = 1;i <lHeight*lLineBytes*2;i+=2)	{		fftSrc[i] = fftSrc[i] * fftKernel[i] - fftSrc[i+1] * fftKernel[i+1];		fftSrc[i+1] = fftSrc[i] * fftKernel[i+1] + fftSrc[i+1] * fftKernel[i];	}

⌨️ 快捷键说明

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