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

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

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

腐蚀

概念解释

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

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

      以下图来理解上述概念

      下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。

2345_image_file_copy_150.jpg

      上图应该用0替换锚点的1。

示例

      原图

2345_image_file_copy_151.jpg

代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_152.jpg

膨胀

概念解释

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

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

      以下图来理解上述概念

      下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。

2345_image_file_copy_153.jpg      

上图应该膨胀后应该用9替换锚点的1。

示例

      原图

2345_image_file_copy_154.jpg

      代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_155.jpg

开运算

概念解释

      先腐蚀后膨胀。可以去除小颗粒噪声,断开物体之间的粘连。.

      作用: 用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。.

示例

     原图

2345_image_file_copy_156.jpg

      代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_157.jpg

闭运算

概念解释

      先膨胀后腐蚀。

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

示例

原图

2345_image_file_copy_158.jpg

      代码

      相关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);
    }
}

执行结果

2345_image_file_copy_159.jpg

顶帽

概念解释

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

示例

     原图

2345_image_file_copy_160.jpg

      代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_161.jpg

黑帽

概念解释

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

示例

     原图

2345_image_file_copy_162.jpg

      代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_163.jpg

形态学梯度

概念解释

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

示例

      原图

2345_image_file_copy_164.jpg

      代码

      相关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);
    }
}

      执行结果

2345_image_file_copy_165.jpg

相关文章
|
8月前
|
计算机视觉 Python
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
OpenCV形态学运算中梯度运算、顶帽、黑帽运算讲解与实战应用(附Python源码)
216 0
|
6月前
|
存储 计算机视觉
OpenCv形态学(一)
OpenCv形态学(一)
|
7月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
43 0
|
8月前
|
编解码 计算机视觉 C++
【OpenCV】—形态学滤波(1):腐蚀与膨胀
【OpenCV】—形态学滤波(1):腐蚀与膨胀
|
8月前
|
API 计算机视觉
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
|
8月前
|
计算机视觉
OpenCV按位逻辑运算
OpenCV按位逻辑运算
36 0
|
8月前
|
计算机视觉
OpenCV(三十一):形态学操作
OpenCV(三十一):形态学操作
118 0
|
8月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
55 0
|
3月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
621 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
4月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
58 4