📄 morphology.cpp
字号:
}
}
//腐蚀运算,定义域内输入数据减对应模板数据,并求最小值,该最小值便是该点输出
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 + -