二值图像形态学主要是膨胀腐蚀,直白一点说,就是放大一圈与缩小一圈。灰度形态学的方式大体上差不多。从另一个角度来说,放大或缩小一圈,就是在8邻域中取最大值和最小值。所以,灰度形态学,也是这样。
灰度形态学的膨胀,就是以某像素为中心,取最大值,相反腐蚀,就是取最小值。下面以Lena灰度图像为基础,做灰度形态学变换。
先上原图:
膨胀图:
膨胀后的图像提高 了整体亮度,并且变得更模糊了。
腐蚀图:
腐蚀后的图像,降低了整个图像的亮度,同样变得更模糊了。
同样的,开运算和闭运算的图片如下:
开运算图像如下:
闭运算图像如下:
同时贴上灰度形态学的膨胀的代码:
void GrayMorphDilate(PStruImage dilateImg, PStruImage image)
{
int i, j, k;
unsigned char *cptr = NULL;
unsigned char *dcptr = NULL;
int step = image->bytePerLine;
int offset[8] = { 0 };
offset[0] = -dilateImg->bytePerLine - 1;
offset[1] = -dilateImg->bytePerLine;
offset[2] = -dilateImg->bytePerLine + 1;
offset[3] = -1;
offset[4] = 1;
offset[5] = dilateImg->bytePerLine - 1;
offset[6] = dilateImg->bytePerLine;
offset[7] = dilateImg->bytePerLine + 1;
memset(dilateImg->cptr, 0, dilateImg->imgSize);
for (i = 1; i < image->height - 1; i++)
{
dcptr = dilateImg->cptr + i*dilateImg->bytePerLine + 1;
cptr = image->cptr + i*image->bytePerLine;
for (j = 1; j < image->width - 1; j++)
{
unsigned char maxval = cptr[j];
for (k = 0; k < 8; k++)
{
if (cptr[offset[k]+j]>maxval)
maxval = cptr[offset[k] + j];
}
dcptr[j] = maxval;
}
}
}
源代码:https://download.csdn.net/download/finger157959/12528142