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

📄 spacefilter.cpp

📁 各种数据压缩和解压的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		for (j = 0; j < lHeight; j++)		//被处理像素在j行
		{
			// 计数清零
			R = G = B = 0;

			// 进行小区域模版滤波
			for (k = i - (int)(lpKernel->Dimention / 2); k < i + (int)(lpKernel->Dimention / 2) + 1; k++)
			{
				for(l = j - (int)(lpKernel->Dimention / 2); l < j + (int)(lpKernel->Dimention / 2) + 1; l++)
				{
					// 防止内存溢出
					if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
					{
						unsigned char TR = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
						R += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TR;

						unsigned char TG = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
						G += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TG;

						unsigned char TB = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
						B += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TB;
					}
				}
			}

			// 进行模版平均
			R /= lpKernel->Divisor;
			G /= lpKernel->Divisor;
			B /= lpKernel->Divisor;

			// 存储计算结果到中间缓存
			*(m_temp + j * lLineBytes + i * 3) = R;
			*(m_temp + j * lLineBytes + i * 3 + 1) = G;
			*(m_temp + j * lLineBytes + i * 3 + 2) = B;
		}
	}

	// 将转换后的中间缓存数据回存到DIB
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lLineBytes; j ++)
		{
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
		}
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDIB);
	LocalUnlock(hLocal);
	LocalFree(hLocal);

	// 恢复光标
	EndWaitCursor();
}


/*************************************************************************
 *
 * 函数名称:
 *   MedianFilter()
 *
 * 参数:
 *   HDIB hDIB          - 待处理的DIB
 *
 * 返回值:
 *   无返回值
 *
 * 说明:
 *   该函数将彩色位图进行中值滤波处理
 *
 ************************************************************************/

void CSpaceFilter::MedianFilter(HDIB hDIB)
{
	// 循环变量
	LONG i;
	LONG j;
	LONG k;
	LONG l;

	// 掩码模版
	unsigned char mask_r[9];
	unsigned char mask_g[9];
	unsigned char mask_b[9];
	COLORREF mask[9];

	// 指向DIB的指针
	LPBYTE lpDIB;
	
	// 指向DIB象素指针
	LPBYTE lpDIBBits;
	
	// 锁定DIB
	lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);

	// 找到DIB图像象素起始位置
	lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
	
	// 判断是否是24-bpp位图
	if (m_clsDIB.DIBBitCount(lpDIB) != 24)
	{
		// 提示用户
		MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) hDIB);
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	// DIB的宽度
	LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
	
	// DIB的高度
	LONG lHeight = m_clsDIB.DIBHeight(lpDIB);

	// 计算图像每行的字节数
	LONG lLineBytes = WIDTHBYTES(lWidth * 24);

	// 申请并分配中间缓存
	HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
	if (hLocal == NULL)
		return;
	LPBYTE m_temp = (LPBYTE)LocalLock(hLocal);

	// 复制图象数据到中间缓存
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lLineBytes; j ++)
		{
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
			j++;
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
			j++;
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
		}
	}

	// 模版滤波
	for (i = 0; i < lWidth; i++)			//被处理像素在i列
	{
		for (j = 0; j < lHeight; j++)		//被处理像素在j行
		{
			// 索引
			int	id = 0;

			// 进行小区域模版滤波
			for (k = i - 1; k < i + 2; k++)
			{
				for(l = j - 1; l < j + 2; l++)
				{
					// 防止内存溢出
					if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
					{
						mask_r[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
						mask_g[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
						mask_b[id] = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
				
						mask[id] = RGB(mask_r[id], mask_g[id], mask_b[id]);
						id++;
					}
				}
			}
			
			// 中间变量
			unsigned char T;
			
			// 冒泡排序法
			for (k = 0; k < 8; k++)		
			{
				for (l = 8; l > k; l--)					
				{
					if (mask_r[l] < mask_r[l - 1])
					{
						T = mask_r[l];
						mask_r[l] = mask_r[l - 1];
						mask_r[l - 1] = T;
					}
					if (mask_g[l] < mask_g[l - 1])
					{
						T = mask_g[l];
						mask_g[l] = mask_g[l - 1];
						mask_g[l - 1] = T;
					}
					if (mask_b[l] < mask_b[l - 1])
					{
						T = mask_b[l];
						mask_b[l] = mask_b[l - 1];
						mask_b[l - 1] = T;
					}
				}
			}
			m_temp[j * lLineBytes + i * 3] = mask_r[4];
			m_temp[j * lLineBytes + i * 3 + 1] = mask_g[4];
			m_temp[j * lLineBytes + i * 3 + 2] = mask_b[4];
		}
	}

	// 将转换后的中间缓存数据回存到DIB
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lLineBytes; j ++)
		{
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
		}
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDIB);
	LocalUnlock(hLocal);
	LocalFree(hLocal);

	// 恢复光标
	EndWaitCursor();
}


/*************************************************************************
 *
 * 函数名称:
 *   OverRun()
 *
 * 参数:
 *   HDIB hDIB          - 待处理的DIB
 *	 LPKERNEL lpKernel	- 获取指向KERNEL结构对象的指针
 *   int T				- 超限阀值
 *
 * 返回值:
 *	 无返回值
 *
 * 说明:
 *   该函数位图进行超限模版滤波处理
 *	
 ************************************************************************/

void CSpaceFilter::OverRun(HDIB hDIB, LPKERNEL lpKernel, int T)
{
	// 循环变量
	LONG i;
	LONG j;
	LONG k;
	LONG l;

	// 临时变量
	LONG R, G, B;
	LONG MR, MG, MB;

	// 指向DIB的指针
	LPBYTE lpDIB;
	
	// 指向DIB象素指针
	LPBYTE lpDIBBits;
	 
	// 锁定DIB
	lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) hDIB);

	// 找到DIB图像象素起始位置
	lpDIBBits = m_clsDIB.FindDIBBits(lpDIB);
	
	// 判断是否是24-bpp位图
	if (m_clsDIB.DIBBitCount(lpDIB) != 24)
	{
		// 提示用户
		MessageBox("请先将其转换为24位色位图,再进行处理!", "系统提示" , MB_ICONINFORMATION | MB_OK);
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) hDIB);
		
		// 返回
		return;
	}
	
	// 更改光标形状
	BeginWaitCursor();
	
	// DIB的宽度
	LONG lWidth = m_clsDIB.DIBWidth(lpDIB);
	
	// DIB的高度
	LONG lHeight = m_clsDIB.DIBHeight(lpDIB);

	// 计算图像每行的字节数
	LONG lLineBytes = WIDTHBYTES(lWidth * 24);

	// 申请并分配中间缓存
	HLOCAL hLocal = LocalAlloc(GHND, lLineBytes * lHeight);
	if (hLocal == NULL)
		return;
	LPBYTE m_temp = (LPBYTE)LocalLock(hLocal);

	// 复制图象数据到中间缓存
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lLineBytes; j ++)
		{
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
			j++;
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
			j++;
			*(m_temp + lLineBytes * i + j) = *((unsigned char *)lpDIBBits + lLineBytes * i + j);
		}
	}

	// 模版滤波
	for (i = 0; i < lWidth; i++)			//被处理像素在i列
	{
		for (j = 0; j < lHeight; j++)		//被处理像素在j行
		{
			// 计数清零
			R = G = B = 0;

			// 进行小区域模版滤波
			for (k = i - (int)(lpKernel->Dimention / 2); k < i + (int)(lpKernel->Dimention / 2) + 1; k++)
			{
				for(l = j - (int)(lpKernel->Dimention / 2); l < j + (int)(lpKernel->Dimention / 2) + 1; l++)
				{
					// 防止内存溢出
					if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
					{
						unsigned char TR = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3);
						unsigned char TG = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 1);
						unsigned char TB = *((unsigned char *)lpDIBBits + l * lLineBytes + k * 3 + 2);
						
						if (k == i && l == j)
						{
							MR = TR;
							MG = TG;
							MB = TB;
						}
						
						R += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TR;
						G += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TG;
						B += lpKernel->Element[k - i + (int)(lpKernel->Dimention / 2)][l - j + (int)(lpKernel->Dimention / 2)] * TB;
					}
				}
			}
			
			// 进行模版平均
			R /= lpKernel->Divisor;
			G /= lpKernel->Divisor;
			B /= lpKernel->Divisor;
			
			// 进行超闲限判断
			if (abs(MR - R) > T)
				MR = R;
			if (abs(MG - G) > T)
				MG = G;
			if (abs(MB - B) > T)
				MB = B;

			// 存储计算结果到中间缓存
			*(m_temp + j * lLineBytes + i * 3) = MR;
			*(m_temp + j * lLineBytes + i * 3 + 1) = MG;
			*(m_temp + j * lLineBytes + i * 3 + 2) = MB;
		}
	}

	// 将转换后的中间缓存数据回存到DIB
	for (i = 0; i < lHeight; i ++)
	{
		for (j = 0; j < lLineBytes; j ++)
		{
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
			j++;
			*((unsigned char *)lpDIBBits + lLineBytes * i + j) = *(m_temp + lLineBytes * i + j);
		}
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDIB);
	LocalUnlock(hLocal);
	LocalFree(hLocal);

	// 恢复光标
	EndWaitCursor();
}

⌨️ 快捷键说明

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