形态学原理原理介绍
本文所有程序均在ubuntu环境编写,Windows 兼容性未知,理论上不会有什么问题,如果运气不好,运行失败,建议百度。
腐蚀膨胀
opencv4.0中提供了腐蚀膨胀的函数 erode()、dilate()函数,用起来也方便。但是我的课程实践要求自己编写函数,所以这里附上不依赖opencv膨胀腐蚀函数的c++的腐蚀膨胀程序的实现代码。
//膨胀函数
void dilatetest(uchar *imageBuffer,uchar *outBuffer,int imageWidth,int imageHeight)
{
uchar *dilateBuffer = (uchar *)malloc((imageWidth+2)*(2+imageHeight)); //开辟空间 (扩展边界便于处理原图像边界)
memset(dilateBuffer,0,(imageHeight+2)*(imageWidth+2));
for (int i = 0;i < imageHeight;i++) //读取img的值,跳过边界点。
{
for (int j = 0 ; j < imageWidth; j++)
{
dilateBuffer[(i+1)*(imageWidth+2)+j+1] = imageBuffer[i*imageWidth + j];
}
}
/*以rows=cols=3为例 imageBuffer为[123456789] dilateBuffer为[0000001230045600789000000]*/
uchar *srcImage = dilateBuffer;
for (int i = 0;i < imageWidth; i++)
{
for (int j = 0;j < imageHeight;j++)
{
uchar MaxNum = 0;
srcImage = (dilateBuffer + (i*(imageWidth +2)+j)); //实现锚点的遍历
for (int m = 0;m<3;m++) //3x3的内核
{
for (int n = 0; n < 3;n++)
{
if (MaxNum < srcImage[n]) //将内核中最大的像素值提取
{
MaxNum = srcImage[n];
}
}
srcImage = (srcImage + m*(imageWidth +2)); //跳到内核下一行
}
outBuffer[i*imageWidth +j] = MaxNum; //将锚点的值付给一个动态内存空间
}
}
}
//腐蚀定义 定义与膨胀雷同 区别是提取最小像素值
void erodetest(uchar *imageBuffer,uchar *outBuffer,int imageWidth,int imageHeight)
{
uchar *erodeBuffer = (uchar *)malloc((imageWidth+2)*(2+imageHeight));
memset(erodeBuffer,255,(imageHeight+2)*(imageWidth+2));
for (int i = 0;i < imageHeight;i++)
{
for (int j = 0 ; j < imageWidth; j++)
{
erodeBuffer[(i+1)*(imageWidth+2)+j+1] = imageBuffer[i*imageWidth + j];
}
}
uchar *srcImage = erodeBuffer;
for (int i = 0;i < imageWidth; i++)
{
for (int j = 0;j < imageHeight;j++)
{
uchar tempNum = 255;
srcImage = (erodeBuffer + (i*(imageWidth +2)+j));
for (int m = 0;m<3;m++)