六、OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)


本文采用JavaOpenCV进行OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)示例的演示。

腐蚀

概念解释

       假设有图像A和结构元素B结构元素B在A上移动,其中B定义>中心为锚点,计算B覆盖下A的最小像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

       作用:腐蚀可以用于滤波,选择适当的结构元素,可以滤掉所有不能完全包含结构元素的噪声点。但是在滤除噪声的时候,对前景图像的形状也会产生影响,尤其是形状边缘,但是当只关心物体的位置和个数时,就不用太考虑形状边缘的变化,可以使用腐蚀来滤除噪声。 (去除细小的不必要的“杂质”,但也影响到了原图)

       以下图来理解上述概念
       下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。
在这里插入图片描述
       上图应该用0替换锚点的1。

示例

       原图
在这里插入图片描述
       代码
       相关API

       Imgproc.erode(src,dst,s);
       src:需要处理的图像。
       dst:处理结果。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_1.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //腐蚀
            Imgproc.erode(src,dst,s);
                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);
    }
}

       执行结果
在这里插入图片描述

膨胀

概念解释

       假设有图像A和结构元素B结构元素B在A上移动,其中B定义>中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状

       作用:膨胀 类似与 ’ 领域扩张 ’ ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。

       以下图来理解上述概念
       下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。
在这里插入图片描述
       上图应该膨胀后应该用9替换锚点的1。

示例

       原图
在这里插入图片描述

       代码
       相关API

       膨胀函数
       Imgproc.dilate(src,dst,s);
       src:需要处理的图像。
       dst:处理结果。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
        Mat src=Imgcodecs.imread("img_1.png");
        //创建结构元素(形状、大小、中心点)
        Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(9,9),new Point(-1,-1));
        //目标容器
        Mat dst=new Mat();
        //膨胀
        Imgproc.dilate(src,dst,s);
        //展示图片
        HighGui.imshow("标题",dst);
        HighGui.waitKey(0);

    }
}

       执行结果
在这里插入图片描述

开运算

概念解释

       先腐蚀后膨胀。可以去除小颗粒噪声,断开物体之间的粘连。.
       作用: 用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。.

示例

       原图
在这里插入图片描述
       代码
       相关API

       开运算函数
       Imgproc.morphologyEx(src,dst,Imgproc.MORPH_OPEN,s);
       src:需要处理的图像。
       dst:处理结果。
       Imgproc.MORPH_OPEN:开运算的标识。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_1.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //开运算
            Imgproc.morphologyEx(src,dst,Imgproc.MORPH_OPEN,s);
                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);

    }
}

       执行结果
在这里插入图片描述

闭运算

概念解释

       先膨胀后腐蚀。
       作用:闭运算与开运算相反,能够填平前景物体内的小裂缝、间断和小孔,而总的位置和形状不变。

示例

原图
在这里插入图片描述

       代码
       相关API

       闭运算函数
       Imgproc.morphologyEx(src,dst,Imgproc.MORPH_CLOSE,s);
       src:需要处理的图像。
       dst:处理结果。
       Imgproc.MORPH_CLOSE:闭运算的标识。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_4.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //闭运算
            Imgproc.morphologyEx(src,dst,Imgproc.MORPH_CLOSE,s);
                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);

    }
}

执行结果
在这里插入图片描述

顶帽

概念解释

       顶帽是原图像与开操作之间的差值图像。(结果相当于执行开操作后剩下的)

示例

       原图
在这里插入图片描述
       代码
       相关API

       顶帽函数
       Imgproc.morphologyEx(src,dst,Imgproc.MORPH_TOPHAT,s);
       src:需要处理的图像。
       dst:处理结果。
       Imgproc.MORPH_TOPHAT:顶帽运算的标识。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_4.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //顶帽运算
            Imgproc.morphologyEx(src,dst,Imgproc.MORPH_TOPHAT,s);
                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);

    }
}

       执行结果
在这里插入图片描述

黑帽

概念解释

       黑帽是闭操作图像与源图像的差值图像。(结果相当于被闭运算执行去除的)

示例

       原图
在这里插入图片描述

       代码
       相关API

       黑帽函数
       Imgproc.morphologyEx(src,dst,Imgproc.MORPH_BLACKHAT,s);
       src:需要处理的图像。
       dst:处理结果。
       Imgproc.MORPH_BLACKHAT:黑帽运算的标识。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_4.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //黑帽运算
            Imgproc.morphologyEx(src,dst,Imgproc.MORPH_BLACKHAT,s);

                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);

    }
}

       执行结果
在这里插入图片描述

形态学梯度

概念解释

       膨胀减去腐蚀(相当于的减去的,最后剩下

示例

       原图
在这里插入图片描述

       代码
       相关API

       梯度函数
       Imgproc.morphologyEx(src,dst,Imgproc.MORPH_GRADIENT,s);
       src:需要处理的图像。
       dst:处理结果。
       Imgproc.MORPH_GRADIENT:梯度运算的标识。
       s:结构元素。

       获取结构元素函数
       Imgproc.getStructuringElement(参数1,参数2,参数3);
       参数1:结构元素形状
       参数2:确定结构元素大小
       参数3:确定锚点(-1,-1)默认为最中间

public class DemoMat {
    static{
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }
    public static void main(String[] args) {
        //读取图片
            Mat src=Imgcodecs.imread("img_5.png");
            //创建结构元素(形状、大小、中心点)
            Mat s=Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(3,3),new Point(-1,-1));
            //目标容器
            Mat dst=new Mat();
            //形态学梯度运算
            Imgproc.morphologyEx(src,dst,Imgproc.MORPH_GRADIENT,s);
                        //展示图片
            HighGui.imshow("标题",dst);
            HighGui.waitKey(0);

    }
}

       执行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

齊 天 大 聖

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

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

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

打赏作者

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

抵扣说明:

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

余额充值