📄 func.c
字号:
{
pImage[i*nWidth+j]=pImage[(i+1)*nWidth+j-1];//对此点加与左上相同的标识
}
else
if(pImage[i*nWidth+j-1]>0)//如果与左前为已标识的目标点
{
pImage[i*nWidth+j]=pImage[i*nWidth+j-1];//对此点加与左前相同的标识
}
else//如果都不相同,则建立新标识N=N-1
{
N=N-1;
pImage[i*nWidth+j]=N;//新区域的像素灰度为N-1
count++;
}
}
}
}
/////////////////////////////////////////////////////////////////////
for(i=m;i>=nHeight/2-nNum;i--)
{
for(j=LEFTSIDE;j<RIGHTSIDE;j++)
{
if((pImage[i*nWidth+j]>0)&& //如果有符合条件的像素点
(pImage[(i+1)*nWidth+j+1]>0)&&
(pImage[i*nWidth+j-1]>0)&&
(pImage[(i+1)*nWidth+j+1]!=pImage[i*nWidth+j-1]))
{
U=pImage[i*nWidth+j-1];
V=pImage[(i+1)*nWidth+j+1];
for(x=m;x>=nHeight/2-nNum;x--)
for(y=LEFTSIDE;y<RIGHTSIDE;y++)
{
if(pImage[x*nWidth+y]==U)
pImage[x*nWidth+y]=V; //合并区域
}
count--; //区域数目减一
}
}
}
/////////////////////////////////////////////////////////////////////
return count; //返回标记区域数目
}
/*****************************************************************************/
//函数名称:SmallArea()
//功能:小面积区域消去
//参数:
// unsigned char *pImage 图像数据指针
// int nWidth, int nHeight 图象宽度、高度
// int TArea 消去门限
// int nNum 标记时,垂直方向图像中线上下截取的图像高度
//返回值:int 剩余区域数目
/*****************************************************************************/
int SmallArea(unsigned char *pImage, int nWidth, int nHeight, int TArea, int nNum)
{
int i,j;
int count;
int num; //记录区域数目
int N;
int mark[255]={0}; //mark[]为区域统计的结果
int T; //T为小区域消去的门限
T = TArea;
//////////////////////////////////////////////////////
for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++) //遍历图像,进行区域统计,mark[i]的值
{ //代表灰度为i的区域的面积
for(j=LEFTSIDE;j<RIGHTSIDE;j++)
{
if(pImage[i*nWidth+j]>0)
{
N=pImage[i*nWidth+j];
mark[N]++;
}
}
}
///////////////////////////////////////////////////////////////
num=0; //统计大于门限的区域数目
for(N=0;N<255;N++)
{
if(mark[N]>T)
num++;
}
///////////////////////////////////////////////////////////////
count=0; //遍历统计结果,将低于门限T的区域置为背景色
for(N=0;N<255;N++)
{
if(mark[N]<T)
{
for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++)
{
for(j=LEFTSIDE;j<RIGHTSIDE;j++)
{
if(pImage[i*nWidth+j]==N)
pImage[i*nWidth+j]=0;
}
}
}
if(mark[N]>count)
count=mark[N]; //记录最大区域的面积数
}
////////////////////////////////////////////////////////////////
for(i=nHeight/2-nNum;i<nHeight/2+nNum;i++) //将大于门限的区域灰度置为255
for(j=LEFTSIDE;j<RIGHTSIDE;j++)
if(pImage[i*nWidth+j]>0)
pImage[i*nWidth+j]=255;
////////////////////////////////////////////////////////////////
return num; //返回剩余区域数
}
/*****************************************************************************/
//函数名称:Ruler()
//功能:在图像中间加上标尺显示
//参数:
// unsigned char *pImage 图像数据指针
// int nWidth, int nHeight 图象宽度、高度
// int nY 标尺中心位置的Y坐标
// int nNum 标尺中心位置上下所截取的行数
//返回值:无
/*****************************************************************************/
void Ruler(unsigned char *pImage, int nWidth, int nHeight, int nY, int nNum)
{
int i,j;
for(i=nY-nNum; i<=nY+nNum; i++)
{
for(j=LEFTSIDE/2; j<RIGHTSIDE/2; j++)
{
pImage[i*nWidth*3+j*3] = 255-pImage[i*nWidth*3+j*3];
pImage[i*nWidth*3+j*3+1] = 255-pImage[i*nWidth*3+j*3+1];
pImage[i*nWidth*3+j*3+2] = 255-pImage[i*nWidth*3+j*3+2];
}
}
/* for(i=100; i<nHeight-100; i++)
{
if(pImage[i*nWidth+nWidth/2] > 50)
pImage[i*nWidth+nWidth/2] = 0;
else
pImage[i*nWidth+nWidth/2] = 255;
}
*/
}
/*****************************************************************************/
//函数名称:tag(unsigned char *pImage, int nWidth, int nHeight,int nLeftX, int nUpY, int nRightX, int nDownY, unsigned char R,unsigned char G,unsigned char B)
//功能:在图像指定的矩形区域显示指定颜色标签
//参数:
// unsigned char *pImage 图像数据指针
// int nWidth, int nHeight 图象宽度、高度
// int nLeftX, int nUpY:图像左上角
//` int nRightX, int nDownY:图像右下角
// unsigned char R,unsigned char G,unsigned char B :图像颜色
//返回值:无
/*****************************************************************************/
void Tag(unsigned char *pImage, int nWidth, int nHeight,int nLeftX, int nUpY, int nRightX, int nDownY, unsigned char R,unsigned char G,unsigned char B)
{
int i,j;
for(i=nUpY+22; i<=nDownY+22; i++)
{
for(j=nLeftX; j<nRightX; j++)
{
pImage[i*nWidth*3+j*3] = R;
pImage[i*nWidth*3+j*3+1] = G;
pImage[i*nWidth*3+j*3+2] = B;
}
}
}
/*****************************************************************************/
//函数名称:WidthCal()
//功能:裂纹宽度计算
//参数:
// unsigned char *pImage 图像数据指针
// int nWidth, int nHeight 图象宽度、高度
// int nY 统计宽度中心的Y坐标
// int nNum 统计中心上下所截取的行数
//返回值:int 宽度计算结果
/*****************************************************************************/
int WidthCal(unsigned char *pImage, int nWidth, int nHeight, int nY, int nNum)
{
int i,j;
int nLineWidth[IMAGEHEIGHT]; //整形数组,用于存放每行宽度
int nLeft, nRight; //左边界点,右边界点
int nPartCount; //宽度总数
int nAvgPart; //每段的平均宽度
for(i=nY-nNum; i<=nY+nNum; i++)
{
int nTempWidth=0;
for(j=LEFTSIDE; j<RIGHTSIDE; j++)
{
if(pImage[i*nWidth+j] == 255 &&
pImage[i*nWidth+j+1] == 255 &&
pImage[i*nWidth+j-1] != 255 )
{
nLeft = j;
}
if(pImage[i*nWidth+j] == 255 &&
pImage[i*nWidth+j-1] == 255 &&
pImage[i*nWidth+j+1] != 255 )
{
nRight = j;
if(nTempWidth < (nRight - nLeft))
nTempWidth = nRight - nLeft;
}
}
nLineWidth[i-(nY-nNum)] = nTempWidth;
}
nPartCount = 0;
for(i=0; i<=2*nNum; i++)
{
nPartCount += nLineWidth[i];
}
nAvgPart = nPartCount/(2*nNum+1);
//将测量部分置成灰色
for(i=nY-nNum; i<=nY+nNum; i++)
{
for(j=0; j<nWidth; j++)
{
if(pImage[i*nWidth+j] == 255)
pImage[i*nWidth+j] = 50;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -