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

📄 morphology.cpp

📁 将数字图像处理的一般算法都集中在一个MFC的框架中
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		}
	}

	//腐蚀运算,定义域内输入数据减对应模板数据,并求最小值,该最小值便是该点输出
	int gray,tmp;
	for(i=maskH/2;i<imgHeight+maskH/2;i++)
	{
		for(j=maskW/2;j<lineByte+maskW/2;j++)
		{
			gray=255;
			for(k=-maskH/2;k<=maskH/2;k++)
			{
				for(l=-maskW/2;l<=maskW/2;l++)
				{
					if(maskBuf[(k+maskH/2)*maskW+l+maskW/2]){
						tmp=*(buf+(i+k)*(lineByte+maskW)+j+l)-
							maskBuf[(k+maskH/2)*maskW+l+maskW/2];
						if(tmp<gray)		
							gray=tmp;
					}
				}
			}
			if(gray<0)
				*(imgBufOut+(i-maskH/2)*lineByte+j-maskW/2)=0;
			else
				*(imgBufOut+(i-maskH/2)*lineByte+j-maskW/2)=gray;
		}
	}

	//释放缓冲区
  	delete []buf;
}

/***********************************************************************
* 函数名称:
* BasicDilationForGray()
*
*函数参数:
*  unsigned char *imgBufIn   -待腐蚀的图像
*  unsigned char *imgBufOut  -腐蚀后的结果
*  int imgWidth   -图像宽
*  int imgHeight   -图像高
*  int *maskBuf   -结构元素缓冲区指针
*  int maskW   -结构元素宽
*  int maskH   -结构元素高
*
*返回值:
*   无
*
*说明:灰值膨胀基本运算,后面的灰值开/闭/形态学梯度等操作都要调用这个函数
***********************************************************************/
void Morphology::BasicDilationForGray(unsigned char *imgBufIn, 
					unsigned char *imgBufOut,int imgWidth,int imgHeight,
					int *maskBuf, int maskW, int maskH)
{
	//循环变量
	int i,j,k,l;

	//图像每行像素所占字节数
	int lineByte=(imgWidth+3)/4*4;
	int gray,tmp;

		//将输入图像,上下加m_maskH/2个像素的灰度为0的黑边,左右加m_maskW/2个像
	//素的灰度为0的黑边,加边后的图像存入buf
	unsigned char *buf=new unsigned char [(imgHeight+maskH)*(lineByte+maskW)];
	for(i=0;i<imgHeight+maskH;i++)
	{
		for(j=0;j<lineByte+maskW;j++)
		{
			if(i<maskH/2||i>=imgHeight+maskH/2||j<maskW/2||j>=lineByte+maskW/2)
				*(buf+i*(lineByte+maskW)+j)=0;
			else
				*(buf+i*(lineByte+maskW)+j)=*(imgBufIn+(i-maskH/2)*lineByte+j-maskW/2);
		}
	}


	//膨胀运算
	for(i=maskH/2;i<imgHeight+maskH/2;i++)
	{
		for(j=maskW/2;j<imgWidth+maskW/2;j++)
		{
			gray=0;
			for(k=-maskH/2;k<=maskH/2;k++)
			{
				for(l=-maskW/2;l<=maskW/2;l++)
				{
					if(maskBuf[(k+maskH/2)*maskW+l+maskW/2]){
						tmp=*(buf+(i+k)*(lineByte+maskW)+j+l)
							+maskBuf[(k+maskH/2)*maskW+l+maskW/2];
						if(tmp>gray)		
							gray=tmp;
					}
				}
			}
			if(gray>255)
				*(imgBufOut+(i-maskH/2)*lineByte+j-maskW/2)=255;
			else
				*(imgBufOut+(i-maskH/2)*lineByte+j-maskW/2)=gray;
		}
	}

	//释放缓冲区
	delete []buf;
}


/***********************************************************************
* 函数名称:
* GrayErosion()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:灰值腐蚀,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayErosion()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//腐蚀
	BasicErosionForGray(m_pImgData, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
}


/***********************************************************************
* 函数名称:
* GrayDilation()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:灰值膨胀,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayDilation()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//膨胀
	BasicDilationForGray(m_pImgData, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

}

/***********************************************************************
* 函数名称:
* GrayOpen()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:灰值开运算,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayOpen()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//腐蚀
	BasicErosionForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//膨胀
	BasicDilationForGray(buf, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
	
	//释放缓冲区
	delete []buf;
}

/***********************************************************************
* 函数名称:
* GrayClose()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:灰值闭运算,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayClose()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//膨胀
	BasicDilationForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//腐蚀
	BasicErosionForGray(buf, m_pImgDataOut, m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//释放缓冲区
	delete []buf;
}

/***********************************************************************
* 函数名称:
* GrayGradient()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:灰值形态学梯度,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayGradient()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//腐蚀
	BasicErosionForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//膨胀
	BasicDilationForGray(m_pImgData, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//形态学梯度为膨胀的结果减腐蚀的结果
	int i, j;
	for(i=0;i<m_imgHeight;i++){
		for(j=0; j<m_imgWidth;j++){
			*(m_pImgDataOut+i*lineByte+j) -= *(buf+i*lineByte+j);
		}
	}

	//释放缓冲区
	delete []buf;

}

/***********************************************************************
* 函数名称:
* GrayTopHatPeak()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:波峰检测器,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayTopHatPeak()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//先腐蚀后膨胀为开运算
	BasicErosionForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
	BasicDilationForGray(buf, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//波峰检测器为原图减去开运算的结果
	int i, j;
	for(i=0;i<m_imgHeight;i++){
		for(j=0; j<m_imgWidth;j++){
			*(m_pImgDataOut+i*lineByte+j) 
				= *(m_pImgData+i*lineByte+j)-*(m_pImgDataOut+i*lineByte+j);
		}
	}

	//释放缓冲区
	delete []buf;

}

/***********************************************************************
* 函数名称:
* GrayTopHatVally()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:波谷检测器,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayTopHatVally()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//先膨胀后腐蚀为闭运算
	BasicDilationForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
	BasicErosionForGray(buf, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);


	//波谷检测器为闭运算减去原图的结果
	int i, j;
	for(i=0;i<m_imgHeight;i++){
		for(j=0; j<m_imgWidth;j++){
			*(m_pImgDataOut+i*lineByte+j) -= *(m_pImgData+i*lineByte+j);
		}
	}

	//释放缓冲区
	delete []buf;
}

/***********************************************************************
* 函数名称:
* GrayTopHatPeakVally()
*
*函数参数:
*  无
*
*返回值:
*   无
*
*说明:峰谷检测器,m_pImgData为输入图像,m_pImgDataOut为输出图像
***********************************************************************/
void Morphology::GrayTopHatPeakVally()
{
	//如果没有结构元素输入,则返回
	if(m_maskBuf==NULL)
		return;

	//每行图像数据的字节数,为4的倍数
	int lineByte=(m_imgWidth+3)/4*4;

	//中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *buf=new unsigned char[lineByte*m_imgHeight];

	//先膨胀后腐蚀为闭运算,闭运算后m_pImgDataOut中存放了闭运算的结果
	BasicDilationForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
	BasicErosionForGray(buf, m_pImgDataOut,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	////中间结果缓冲区申请,用来存放腐蚀后的中间结果
	unsigned char *bufOpen=new unsigned char[lineByte*m_imgHeight];

	//先腐蚀后膨胀为开运算,开运算后bufOpen中存放了开运算的结果
	BasicErosionForGray(m_pImgData, buf,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);
	BasicDilationForGray(buf, bufOpen,m_imgWidth,m_imgHeight,
		m_maskBuf, m_maskW, m_maskH);

	//峰谷检测器为闭运算减去开运算的结果
	int i, j;
	for(i=0;i<m_imgHeight;i++){
		for(j=0; j<m_imgWidth;j++){
			*(m_pImgDataOut+i*lineByte+j) -= *(bufOpen+i*lineByte+j);
		}
	}

	//释放缓冲区
	delete []buf;
	delete []bufOpen;
}

⌨️ 快捷键说明

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