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


OpenCV形态学操作

  • 腐蚀
    • 概念解释
    • 示例
  • 膨胀
    • 概念解释
    • 示例
  • 开运算
    • 概念解释
    • 示例
  • 闭运算
    • 概念解释
    • 示例
  • 顶帽
    • 概念解释
    • 示例
  • 黑帽
    • 概念解释
    • 示例
  • 形态学梯度
    • 概念解释
    • 示例

本文采用JavaOpenCV进行OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)示例的演示。
腐蚀 概念解释 假设有图像A和结构元素B结构元素B在A上移动,其中B定义>中心为锚点,计算B覆盖下A的最小像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
【javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)】作用:腐蚀可以用于滤波,选择适当的结构元素,可以滤掉所有不能完全包含结构元素的噪声点。但是在滤除噪声的时候,对前景图像的形状也会产生影响,尤其是形状边缘,但是当只关心物体的位置和个数时,就不用太考虑形状边缘的变化,可以使用腐蚀来滤除噪声。 (去除细小的不必要的“杂质”,但也影响到了原图)
以下图来理解上述概念。
下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

上图应该用0替换锚点的1。
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

膨胀 概念解释 假设有图像A和结构元素B结构元素B在A上移动,其中B定义>中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状
作用:膨胀 类似与 ’ 领域扩张 ’ ,将图像的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。
以下图来理解上述概念。
下图为结构元素是3×3的矩形,图像是9×9且通道类型为单通道。
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

上图应该膨胀后应该用9替换锚点的1。
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

开运算 概念解释 先腐蚀后膨胀。可以去除小颗粒噪声,断开物体之间的粘连。.
作用: 用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。.
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

闭运算 概念解释 先膨胀后腐蚀。
作用:闭运算与开运算相反,能够填平前景物体内的小裂缝、间断和小孔,而总的位置和形状不变。
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

顶帽 概念解释 顶帽是原图像与开操作之间的差值图像。(结果相当于执行开操作后剩下的)
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

黑帽 概念解释 黑帽是闭操作图像与源图像的差值图像。(结果相当于被闭运算执行去除的)
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

形态学梯度 概念解释 膨胀减去腐蚀(相当于的减去的,最后剩下
示例 原图
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

代码
相关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=https://www.it610.com/article/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); } }

执行结果
javaOpenCV|OpenCV形态学操作(腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、形态学梯度)
文章图片

    推荐阅读