OpenCVForUnity(十)扩张与侵蚀效果


前言

在这个教程中,您将学习两种常见的图像形态运算符:侵蚀和膨胀。为此,您将使用OpenCV库中的两个函数:erode 和 dilate。
形态操作是一组基于形状的图像处理操作。形态操作会将结构元素应用于输入图像,并生成输出图像。

其中最基本的形态操作是侵蚀和膨胀。它们具有广泛的应用,包括:
1.消除噪声。
2.分离图像中的单个元素并连接不同的元素。
3.查找图像中的凸点或孔洞。

我们将使用以下图像作为示例来简要解释侵蚀和膨胀操作:
在这里插入图片描述


扩张

在形态操作中,包括将图像与一个内核(B)进行卷积,该内核可以是任何形状或尺寸,通常是正方形或圆形。内核具有一个定义的锚点,通常位于内核的中心。

当内核在图像上移动时,我们计算内核与图像重叠部分的最大像素值,并用该最大值替换锚点位置的像素值。可以推断出,这种最大化的操作会使图像中的亮区域扩大(因此称为膨胀操作)。
以提供的图像为例,通过应用膨胀操作,我们可以得到以下结果:BB
在这里插入图片描述

在这个例子中,我们将使用一个倒置的原始图像来更好地理解概念,并避免可能的混淆。在这个倒置的图像中,白色的对象表示字母。

我们将对这个倒置的图像应用两次3x3大小的矩形结构元素的膨胀操作。
通过这两次膨胀操作,我们会观察到背景(即黑色区域)被扩大,而字母的白色区域则保持不变。这是因为膨胀操作会将结构元素放置在图像上,然后计算最大像素值,并用该值替换结构元素的中心像素。

因此,在这个例子中,这两次膨胀操作会扩大背景(即黑色地区),而字母的白色区域则保持不变。

在这里插入图片描述

案例展示

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/flower.jpg";
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//扩张效果处理
int dilationSize = 5;
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * dilationSize + 1, 2 * dilationSize + 1), new Point(dilationSize, dilationSize));
Imgproc.dilate(blurMat, blurMat, element);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//展示图片
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(blurMat, blurTexture);
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

以下左边是原图,右边是效果图:
在这里插入图片描述

首先是需要用Imgproc.getStructuringElement为函数构建指定形状和大小:
Imgproc.getStructuringElement(shape形状,ksize大小,anchor锚点)

  1. 矩形框:Imgproc.MORPH_RECT
  2. 十字架:Imgproc.MORPH_CROSS
  3. 椭圆:Imgproc.MORPH_ELLIPSE

侵蚀

侵蚀操作是膨胀操作的反向操作。它计算给定内核区域的局部最小值。
当侵蚀操作的内核在图像上扫描时,我们计算内核与图像重叠部分的最小像素值,并用该最小值替换锚点位置的图像像素值。
回到之前的膨胀的例子,我们现在将侵蚀操作应用于原始图像。结果如下,您可以看到图像的亮区域(背景)变得更窄,而暗区域(字母)变得更大。
在这里插入图片描述

根据您的要求,我们将对反转的原始图像应用两次具有3x3大小的矩形结构元素的侵蚀操作。请注意,在这个过程中,我们使用的是倒置的图像。
通过这两次侵蚀操作,我们可以观察到对象(即字母)变得更白。这是因为侵蚀操作计算内核区域的局部最小值,并用该最小值替换锚点位置的图像像素值。
在这里插入图片描述

所以,在这个例子中,这两次侵蚀操作使得图像中的对象(即字母)变得更白。

案例展示

//图片读取
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/ZI.jpg";
Mat blurMat = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
//消融效果处理
int erosionSize = 1;
Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(2 * erosionSize + 1, 2 * erosionSize + 1), new Point(erosionSize, erosionSize));
Imgproc.erode(blurMat, blurMat, element);
//色彩模式转换
Imgproc.cvtColor(blurMat, blurMat, Imgproc.COLOR_BGR2RGB);
//图片展示
Texture2D blurTexture = new Texture2D(blurMat.cols(), blurMat.rows(), TextureFormat.RGB24, false);
Utils.matToTexture2D(blurMat, blurTexture);
GameObject.Find("Cube1").GetComponent<Renderer>().material.mainTexture = blurTexture;

以下左边是原图,右边是效果图:
在这里插入图片描述

结语:

扩张和侵蚀是一对非常有用的辅助效果,理解了他的工作原理和效果可以为图形进行进一步的加工和处理,以达到想要的效果。
好啦,这节的介绍就到这里,欢迎观看,可以的话顺手点个赞,谢谢。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小盖子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值