opencv 4.0 形态学图像处理(粒度测定、腐蚀膨胀、开闭运算、顶帽黑帽运算、形态学重建)C++代码实现

形态学原理原理介绍

数字图像处理 第三版》(冈萨雷斯)——第九章 形态学图像处理

本文所有程序均在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++)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值