2020-12-26

数字图像处理(湍流模型,运动模糊噪声的添加及逆滤波)

1.湍流模型噪声的添加及逆滤波

这里是在频域添加的,就是要先进行(快速)傅里叶正变换得到图像的频域,再在频域添加湍流模型噪声,不会快速傅里叶变换的,可以去我上个博客看看,快速傅里叶变换在我上个博客里有写。废话不多说,直接贴代码。
注意:
1.我这里写的函数的参数名是根据我的快速傅里叶变换的频谱函参数名写的,两者要对应上
2.在逆滤波的时候要注意除以噪声的频域的实部跟虚部不能同时为零,要不然就出现“雪花”图
湍流模型噪声的添加:

std::vector<double>real_1, img_1, pfTurbuMatrix;
void CExImage1View::OnFturbu()
{
	// TODO: 在此添加命令处理程序代码
	OnFuliyekuaiz();
	int iImageWidth = m_Image.GetWidth();
	int iImageHeight = m_Image.GetHeight();
	for (int i = 0; i < iImageWidth * iImageHeight; i++)
	{
		real_1.push_back(0.0);
		img_1.push_back(0.0);
		pfTurbuMatrix.push_back(0.0);
	}
	double fTurbu = 0.0025;


	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			pfTurbuMatrix[(size_t)v * iImageWidth + u] = exp(-fTurbu * pow((pow((double)v -
				iImageHeight / 2.0, 2.0) + pow((double)u - iImageWidth / 2.0, 2.0)), 5.0 / 6.0));
			real_1[(size_t)v * iImageWidth + u] = fRealPart2[(size_t)v * iImageWidth + u] * pfTurbuMatrix[(size_t)v * iImageWidth + u];
			img_1[(size_t)v * iImageWidth + u] = fImgPart2[(size_t)v * iImageWidth + u] * pfTurbuMatrix[(size_t)v * iImageWidth + u];
		}
	}

	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			fRealPart2[(size_t)v * iImageWidth + u] = real_1[(size_t)v * iImageWidth + u];
			fImgPart2[(size_t)v * iImageWidth + u] = img_1[(size_t)v * iImageWidth + u];
		}
	}
	MessageBox(_T("添加湍流噪声,完成"));
	OnFuliyekuaif();
}

湍流模型噪声逆滤波:

void CExImage1View::OnFturbuf()
{
	// TODO: 在此添加命令处理程序代码
	OnFuliyekuaiz();
	int iImageWidth = m_Image.GetWidth();
	int iImageHeight = m_Image.GetHeight();
	real_1.clear();
	img_1.clear();
	for (int i = 0; i < iImageWidth * iImageHeight; i++)
	{
		real_1.push_back(0.0);
		img_1.push_back(0.0);
	}
	double fTurbu = 0.0025;

	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			if ((pow((double)v - iImageHeight / 2.0, 2) + pow((double)u - iImageWidth / 2.0, 2)) < 4900)
			{
				real_1[(size_t)v * iImageWidth + u] = fRealPart2[(size_t)v * iImageWidth + u] / pfTurbuMatrix[(size_t)v * iImageWidth + u];
				img_1[(size_t)v * iImageWidth + u] = fImgPart2[(size_t)v * iImageWidth + u] / pfTurbuMatrix[(size_t)v * iImageWidth + u];
			}
		}
	}
	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			fRealPart2[(size_t)v * iImageWidth + u] = real_1[(size_t)v * iImageWidth + u];
			fImgPart2[(size_t)v * iImageWidth + u] = img_1[(size_t)v * iImageWidth + u];
		}
	}
	MessageBox(_T("湍流噪声逆滤波,完成"));
	OnFuliyekuaif();
}

2.运动模糊的添加及逆滤波

运动模糊的添加:

std::vector<double>real_2, img_2, Movingreal, Movingimg;
void CExImage1View::OnFmohu()
{
	// TODO: 在此添加命令处理程序代码
	OnFuliyekuaiz();
	//运动估计参数
	int iImageWidth = m_Image.GetWidth();
	int iImageHeight = m_Image.GetHeight();

	for (int i = 0; i < iImageWidth * iImageHeight; i++)
	{
		Movingreal.push_back(0.0);
		Movingimg.push_back(0.0);
	}
	double fA, fB, fT;
	fA = 0.1;
	fB = 0.1;
	fT = 1.0;
	for (int i = 0; i < iImageWidth * iImageHeight; i++)
	{
		real_2.push_back(0.0);
		img_2.push_back(0.0);

	}
	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			//获取运动估计模型
			double fCenterX = (double)u - iImageWidth / 2.0;
			double fCenterY = (double)v - iImageHeight / 2.0;
			double fScale = PI * (fCenterX * fA + fCenterY * fB);
			if (fScale == 0)
			{
				Movingreal[(size_t)v * iImageWidth + u] = 1.0;
				Movingimg[(size_t)v * iImageWidth + u] = 0;
			}
			else
			{
				Movingreal[(size_t)v * iImageWidth + u] = fT * sin(fScale) / (fScale) * (cos(fScale));
				Movingimg[(size_t)v * iImageWidth + u] = fT * sin(fScale) / (fScale) * (-sin(fScale));
			}
			real_2[(size_t)v * iImageWidth + u] = fRealPart2[(size_t)v * iImageWidth + u] * Movingreal[(size_t)v * iImageWidth + u]
				- fImgPart2[(size_t)v * iImageWidth + u] * Movingimg[(size_t)v * iImageWidth + u];
			img_2[(size_t)v * iImageWidth + u] = fRealPart2[(size_t)v * iImageWidth + u] * Movingimg[(size_t)v * iImageWidth + u]
				+ fImgPart2[(size_t)v * iImageWidth + u] * Movingreal[(size_t)v * iImageWidth + u];
		}
	}
	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			fRealPart2[(size_t)v * iImageWidth + u] = real_2[(size_t)v * iImageWidth + u];
			fImgPart2[(size_t)v * iImageWidth + u] = img_2[(size_t)v * iImageWidth + u];
		}
	}
	MessageBox(_T("添加运动模糊,完成"));
	OnFuliyekuaif();
}

运动模糊逆滤波:

void CExImage1View::OnFmohuf()
{
	// TODO: 在此添加命令处理程序代码
	OnFuliyekuaiz();
	int iImageWidth = m_Image.GetWidth();
	int iImageHeight = m_Image.GetHeight();
	std::vector<double>real_3, img_3, Movingreal1, Movingimg1;
	for (int i = 0; i < iImageWidth * iImageHeight; i++)
	{
		real_3.push_back(0.0);
		img_3.push_back(0.0);
		Movingreal1.push_back(0.0);
		Movingimg1.push_back(0.0);
	}
	double fA, fB, fT;
	fA = 0.1;
	fB = 0.1;
	fT = 1.0;
	for (int v = 0; v < iImageHeight; v++)
	{
		for (int u = 0; u < iImageWidth; u++)
		{
			//获取运动估计模型
			double fCenterX = (double)u - iImageWidth / 2.0;
			double fCenterY = (double)v - iImageHeight / 2.0;
			double fScale = PI * (fCenterX * fA + fCenterY * fB);
			if ((pow((double)v - iImageHeight / 2.0, 2) + pow((double)u - iImageWidth / 2.0, 2)) < 4900)
			{
				if (fScale == 0)
				{
					Movingreal1[(size_t)v * iImageWidth + u] = fT;
					Movingimg1[(size_t)v * iImageWidth + u] = 0;
				}
				else
				{
					Movingreal1[(size_t)v * iImageWidth + u] = fT * sin(fScale) / (fScale) * (cos(fScale));
					Movingimg1[(size_t)v * iImageWidth + u] = -fT * sin(fScale) / (fScale) * (-sin(fScale));
					if (sqrt(pow(Movingreal1[(size_t)v * iImageWidth + u], 2) + pow(Movingimg1[(size_t)v * iImageWidth + u], 2)) < 0.001)
					{
						Movingreal1[(size_t)v * iImageWidth + u] = 1.0;
						Movingimg1[(size_t)v * iImageWidth + u] = 0;
					}
				}

				real_3[(size_t)v * iImageWidth + u] = (fRealPart2[(size_t)v * iImageWidth + u] * Movingreal1[(size_t)v * iImageWidth + u]
					- fImgPart2[(size_t)v * iImageWidth + u] * Movingimg1[(size_t)v * iImageWidth + u]) / (double)(pow(Movingreal1[(size_t)v * iImageWidth + u], 2)
						+ pow(Movingimg1[(size_t)v * iImageWidth + u], 2));
				img_3[(size_t)v * iImageWidth + u] = (fRealPart2[(size_t)v * iImageWidth + u] * Movingimg1[(size_t)v * iImageWidth + u]
					+ fImgPart2[(size_t)v * iImageWidth + u] * Movingreal1[(size_t)v * iImageWidth + u]) / (double)(pow(Movingreal1[(size_t)v * iImageWidth + u], 2)
						+ pow(Movingimg1[(size_t)v * iImageWidth + u], 2));
				fRealPart2[(size_t)v * iImageWidth + u] = real_3[(size_t)v * iImageWidth + u];
				fImgPart2[(size_t)v * iImageWidth + u] = img_3[(size_t)v * iImageWidth + u];
			}
		}
	}
	MessageBox(_T("运动模糊逆滤波,完成"));
	OnFuliyekuaif();
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十八闲客yxg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值