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

📄 filter.cpp

📁 一些自己做的关于图象处理的程序(如傅立叶变换
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	case 8:
		//image loop
		for (j=iY; j<iHeight-iY; j++)
		{
			for (i=iX; i<iWidth-iX; i++)
			{
				//template loop
				for (jj=0; jj<m_iWinSize; jj++)
				{
					for (ii=0; ii<m_iWinSize; ii++)
					{
						//Get gray value of the pixel in line (j-iY+jj) and column (i-iX+ii)
						piTemplate[jj*m_iWinSize+ii] = 
							pOldBits[(iHeight-1-(j-iY+jj))*nWidthBytes + (i-iX+ii)];
						
					}
				}
				
				//Sort the elements in the template
				BubbleSort(piTemplate, iAmount);
				//Get the median value in the template
				pNewBits[(iHeight-1-j)*nWidthBytes + i] = piTemplate[0];
				 
			}
		}
		break;
	case 16:
		break;
	case 24:
		break;
	case 32:
		break;
	}
	
	//Free the temporary memory
	delete [] piTemplate;
	piTemplate = NULL;
	
	//Free the memory for the old image
	::GlobalUnlock(m_pImageObject->GetDib());
	::GlobalFree(m_pImageObject->GetDib());
	
	//Update the DIB in the object pointed by m_pImaeObject
	::GlobalUnlock(hNewDib); 
	m_pImageObject->SetDib(hNewDib);
	
	return TRUE;
}

/**********************************************************************
* Copyright (c) 2003, Medical Image Processing Lab, Sichuan University 
* All rights reserved.
* 
* 文件名称:Equalize.cpp
* 摘    要:图像滤波中冒泡法CFilter的源文件
* 
* 当前版本:1.1 
* 作    者:jian wei zhang 
* 完成日期:2004年11月8日
************************************************************************/
inline BOOL CFilter::BubbleSort(int *pdData, int iAmount)
{
	ASSERT(pdData != NULL);
	if (iAmount <= 0)
	{
		return FALSE;
	}
	
	int dTemp = 0;
	for (int j=iAmount-1; j>=0; j--)
	{
		for (int i=0; i<j; i++)
		{
			if (pdData[i] > pdData[i+1])
			{
				dTemp = pdData[i];
				pdData[i] = pdData[i+1];
				pdData[i+1] = dTemp;
			}
		}
	}
	return TRUE;
	
}

BOOL CFilter::OnLinerFilter()
{
	if (m_pImageObject == NULL)
	{
		return FALSE;
	}
	
	int iWidth = m_pImageObject->GetWidth();
	int iHeight = m_pImageObject->GetHeight();
	int iNumBits=m_pImageObject->GetNumBits();
	/******************************the old image*****************************/
	unsigned char *pOldBuffer, *pNewBuffer, *pOldBits, *pNewBits;
	BITMAPFILEHEADER *pOldBFH, *pNewBFH;
	BITMAPINFOHEADER *pOldBIH, *pNewBIH;
	RGBQUAD *pOldPalette, *pNewPalette;
	int nWidthBytes, nNumColors;
	
	pOldBuffer = (unsigned char *) m_pImageObject->GetDIBPointer(&nWidthBytes, m_pImageObject->GetNumBits());
	if (pOldBuffer == NULL) 
	{
		return FALSE;
	}
	
	pOldBFH = (BITMAPFILEHEADER *) pOldBuffer;
	pOldBIH = (BITMAPINFOHEADER *) &pOldBuffer[sizeof(BITMAPFILEHEADER)];
	nNumColors = m_pImageObject->GetNumColors();
	pOldPalette = (RGBQUAD *)  &pOldBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	pOldBits = (unsigned char *) &pOldBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	
	/*****************************the new image*****************************/
	DWORD dwNewSize;
	HGLOBAL hNewDib;
	
	//Allocate a global memory block for the new image
	dwNewSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 
		+ nNumColors * sizeof(RGBQUAD)
		+ nWidthBytes * (m_pImageObject->GetHeight());
	hNewDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize);
	if (hNewDib == NULL)
	{
		m_pImageObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
		::GlobalUnlock(m_pImageObject->GetDib());
		return FALSE;
	}
	
	//Get the pointer to the new memory block
	pNewBuffer = (unsigned char *) ::GlobalLock(hNewDib);
	if (pNewBuffer == NULL)
	{
		::GlobalFree( hNewDib );
		m_pImageObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
		::GlobalUnlock(m_pImageObject->GetDib());
		return FALSE;
	}
	
	pNewBFH = (BITMAPFILEHEADER *) pNewBuffer;
	pNewBIH = (BITMAPINFOHEADER *) &pNewBuffer[sizeof(BITMAPFILEHEADER)];
	pNewPalette = (RGBQUAD *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	pNewBits = (unsigned char *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	
	//Make a copy of the old image
	memcpy(pNewBuffer,pOldBuffer,dwNewSize);
	
	/*******************************Liner filter****************************/
	//初始化一些变量
	int iAmount = m_iWinSize*m_iWinSize;
	double totalworth=0;
	double worth;
	double newworth;
	//the original processing point
	int iX = m_iWinSize / 2;
	int iY = m_iWinSize / 2;
	
	
	
	//begin to process
	int i, j, ii, jj;
	switch (iNumBits)
	{
	case 8:
		//image loop
		for (j=iY; j<iHeight-iY; j++)
		{
			for (i=iX; i<iWidth-iX; i++)
			{
				//template loop
				for (jj=0; jj<m_iWinSize; jj++)
				{
					for (ii=0; ii<m_iWinSize; ii++)
					{
						worth+=m_piTemplate[jj*m_iWinSize+ii]*pOldBits[(iHeight-1-(j-iY+jj))*nWidthBytes + (i-iX+ii)];
					    if (m_piTemplate[jj*m_iWinSize+ii]>=0)
						{
							totalworth+=m_piTemplate[jj*m_iWinSize+ii];
					    }	
					}
				}
				newworth=worth/totalworth;
			    pNewBits[(iHeight-1-j)*nWidthBytes + i] = (int)newworth;
				newworth=0;
				worth=0;
				totalworth=0;
			}
		}
		for(i=0;i<m_iWinSize;i++)
		{
			m_piTemplate[i]=0;
		}
		break;
	case 16:
		break;
	case 24:
		break;
	case 32:
		break;
	}
	
	//Free the temporary memory
	delete [] m_piTemplate;
	m_piTemplate = NULL;
	
	//Free the memory for the old image
	::GlobalUnlock(m_pImageObject->GetDib());
	::GlobalFree(m_pImageObject->GetDib());
	
	//Update the DIB in the object pointed by m_pImaeObject
	::GlobalUnlock(hNewDib); 
	m_pImageObject->SetDib(hNewDib);
	
	return TRUE;
}



BOOL CFilter::OnSelectFilter()
{
    if (m_pImageObject == NULL)
	{
		return FALSE;
	}
	
	int iWidth = m_pImageObject->GetWidth();
	int iHeight = m_pImageObject->GetHeight();
	
	/*************************************the old image*****************************/
	unsigned char *pOldBuffer, *pNewBuffer, *pOldBits, *pNewBits;
	BITMAPFILEHEADER *pOldBFH, *pNewBFH;
	BITMAPINFOHEADER *pOldBIH, *pNewBIH;
	RGBQUAD *pOldPalette, *pNewPalette;
	int nWidthBytes, nNumColors;
	
	pOldBuffer = (unsigned char *) m_pImageObject->GetDIBPointer(&nWidthBytes, m_pImageObject->GetNumBits());
	if (pOldBuffer == NULL) 
	{
		return FALSE;
	}
	
	pOldBFH = (BITMAPFILEHEADER *) pOldBuffer;
	pOldBIH = (BITMAPINFOHEADER *) &pOldBuffer[sizeof(BITMAPFILEHEADER)];
	nNumColors = m_pImageObject->GetNumColors();
	pOldPalette = (RGBQUAD *) &pOldBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	pOldBits = (unsigned char *) &pOldBuffer[sizeof(BITMAPFILEHEADER)
		+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	
	/*************************************the new image*****************************/
	DWORD dwNewSize;
	HGLOBAL hNewDib;
	
	//Allocate a global memory block for the new image
	dwNewSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) 
		+ nNumColors * sizeof(RGBQUAD)
		+ nWidthBytes * (m_pImageObject->GetHeight());
	hNewDib = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwNewSize);
	if (hNewDib == NULL)
	{
		m_pImageObject->m_nLastError = IMAGELIB_MEMORY_ALLOCATION_ERROR;
		::GlobalUnlock(m_pImageObject->GetDib());
		return FALSE;
	}
	
	//Get the pointer to the new memory block
	pNewBuffer = (unsigned char *) ::GlobalLock(hNewDib);
	if (pNewBuffer == NULL)
	{
		::GlobalFree( hNewDib );
		m_pImageObject->m_nLastError = IMAGELIB_MEMORY_LOCK_ERROR;
		::GlobalUnlock(m_pImageObject->GetDib());
		return FALSE;
	}
	
	pNewBFH = (BITMAPFILEHEADER *) pNewBuffer;
	pNewBIH = (BITMAPINFOHEADER *) &pNewBuffer[sizeof(BITMAPFILEHEADER)];
	pNewPalette = (RGBQUAD *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
	pNewBits = (unsigned char *) &pNewBuffer[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nNumColors*sizeof(RGBQUAD)];
	
	//Make a copy of the old image
	memcpy(pNewBuffer,pOldBuffer,dwNewSize);
	/******************模板选择滤波*********************************/
			
	//定义存放平均值的变量
	int lpaver[10];
	//int plaver[10];
	int miniv;
	//定义循环变量
    int i, j, n, m;
	//导入10个模板值
	int ptemp[10][25]={{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
	{1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{1,1,1,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
	{1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
	{1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{0,1,1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
	{1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0}};
	/***************************根据方差选择模板****************************/
	
	int pfangcha[10];
	//临时变量
	int temp;
	int ptemplate;
	for(j=2;j<iHeight-2;j++)
	{
		for(i=2;i<iWidth-2;i++)
		{
			//循环取点
			int pixarray[25]={pOldBits[(iHeight-1-j)*nWidthBytes+i],pOldBits[(iHeight-1-j)*nWidthBytes+i+1],
				pOldBits[(iHeight-1-j)*nWidthBytes+i+2],pOldBits[(iHeight-1-j)*nWidthBytes+i+3],pOldBits[(iHeight-1-j)*nWidthBytes+i+4],
				pOldBits[(iHeight-1-j-1)*nWidthBytes+i],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+2],
				pOldBits[(iHeight-1-j-1)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-1)*nWidthBytes+i+4],pOldBits[(iHeight-1-j-2)*nWidthBytes+i],
				pOldBits[(iHeight-1-j-2)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-2)*nWidthBytes+i+2],pOldBits[(iHeight-1-j-2)*nWidthBytes+i+3],
				pOldBits[(iHeight-1-j-2)*nWidthBytes+i+4],pOldBits[(iHeight-1-j-3)*nWidthBytes+i],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+1],
				pOldBits[(iHeight-1-j-3)*nWidthBytes+i+2],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-3)*nWidthBytes+i+4],
				pOldBits[(iHeight-1-j-4)*nWidthBytes+i],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+1],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+2],
				pOldBits[(iHeight-1-j-4)*nWidthBytes+i+3],pOldBits[(iHeight-1-j-4)*nWidthBytes+i+4]};
			
			for(n=0;n<10;n++)
			{
				temp=0;
				ptemplate=0;
				for(m=0;m<25;m++)
				{
					temp+=(ptemp[n][m]*pixarray[m])*(ptemp[n][m]*pixarray[m]);					
					ptemplate+=ptemp[n][m]*pixarray[m];
				}
				pfangcha[n]=temp;
				lpaver[n]=ptemplate;
			}
			//取均值
			lpaver[0]=lpaver[0]/25;
			lpaver[1]=lpaver[1]/7;
			lpaver[2]=lpaver[2]/7;
		    lpaver[3]=lpaver[3]/7;
			lpaver[4]=lpaver[4]/7;
		    lpaver[5]=lpaver[5]/9;
			lpaver[6]=lpaver[6]/7;
		    lpaver[7]=lpaver[7]/7;
		    lpaver[8]=lpaver[8]/7;
			lpaver[9]=lpaver[9]/7;			

							
	/*****************************判断最小方差*******************************/
			miniv=pfangcha[0];
			for(n=1;n<10;n++)
			{
				if (pfangcha[n]<miniv)
				{
					miniv=pfangcha[n];
				}
					
			}
			//方差到均值的映射
			//模板0
			if (miniv==pfangcha[0])
			{
				pNewBits[(iHeight-1-j-2)*nWidthBytes+i+2]=lpaver[0];
				
			}
			//模板1
			else if (miniv==pfangcha[1])
			{
				pNewBits[(iHeight-1-j-1)*nWidthBytes+i+2]=lpaver[1];			
				
			}
			//模板2
			else if (miniv==pfangcha[2]) 
			{
				pNewBits[(iHeight-1-j-2)*nWidthBytes+i+2]=lpaver[2];
			}
			//模板3
			else if (miniv==pfangcha[3]) 
			{
				pNewBits[(iHeight-1-j-1)*nWidthBytes+i]=lpaver[3];
			}
			//模板4
			else if (miniv==pfangcha[4]) 
			{
				pNewBits[(iHeight-1-j)*nWidthBytes+i+1]=lpaver[4];
			}
			//模板5
			else if (miniv==pfangcha[5])
			{
				pNewBits[(iHeight-1-j-1)*nWidthBytes+i+1]=lpaver[5];
			}
			//模板6
			else if (miniv==pfangcha[6])
			{
				pNewBits[(iHeight-1-j-2)*nWidthBytes+i+1]=lpaver[6];
			}
			//模板7
			else if (miniv==pfangcha[7])
			{
				pNewBits[(iHeight-1-j-2)*nWidthBytes+i]=lpaver[7];
			}
			//模板8
			else if (miniv==pfangcha[8])
			{
				pNewBits[(iHeight-1-j)*nWidthBytes+i+1]=lpaver[8];
			}
			//模板9
			else if (miniv==pfangcha[9])
			{
				pNewBits[(iHeight-1-j)*nWidthBytes+i]=lpaver[9];
			}
			
						
		}
	}
	
		
	//Free the memory for the old image
	::GlobalUnlock(m_pImageObject->GetDib());
	::GlobalFree(m_pImageObject->GetDib());
	
	//Update the DIB in the object pointed by m_pImaeObject
	::GlobalUnlock(hNewDib);
	m_pImageObject->SetDib(hNewDib);
	
	return TRUE;
}

⌨️ 快捷键说明

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