六、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天前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
9 1
|
9天前
|
存储 Cloud Native Linux
OpenCV鼠标操作(画红色方框截取图像)
OpenCV鼠标操作(画红色方框截取图像)
|
9天前
|
计算机视觉
OpenCV图像像素逻辑操作
OpenCV图像像素逻辑操作
|
1月前
|
计算机视觉 Python 索引
【Python Opencv】图片与视频的操作
【Python Opencv】图片与视频的操作
113 0
【Python Opencv】图片与视频的操作
|
1月前
|
计算机视觉
OpenCV按位逻辑运算
OpenCV按位逻辑运算
10 0
|
1月前
|
API 计算机视觉
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
|
1月前
|
编解码 计算机视觉 C++
【OpenCV】—形态学滤波(1):腐蚀与膨胀
【OpenCV】—形态学滤波(1):腐蚀与膨胀
|
1月前
|
计算机视觉
OpenCV(三十一):形态学操作
OpenCV(三十一):形态学操作
40 0
|
1月前
|
计算机视觉
OpenCV(二十九):图像腐蚀
OpenCV(二十九):图像腐蚀
31 0
|
1月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
OpenCV这么简单为啥不学——1.7、实现OpenCV自带的七种形态学转换操作
34 0