OpenCV morphologyEx、erode、dilate、getStructuringElement (形态学算子)
::返回OpenCV算子速查表
OpenCV getStructuringElement
- 1. 函数
- 1.1 getStructuringElement
- 1.2 morphologyEx
- 1.3 erode
- 1.4 dilate
- 2. 例程
- 2.1 图像处理效果
- 原图
- 二值化图像
- 对二值化图像进行腐蚀、膨胀、开操作、闭操作
- 梯度图
- 顶帽和黑帽
- 击中击不中
- 2.2 代码
1. 函数
1.1 getStructuringElement
OpenCV官方文档getStructuringElement链接
- getStructuringElement 是为了给形态学操作算子返回指定大小和形状的结构元素。
- 当然你也可以自己构造一个任意的二进制掩码,并将其用作形态学处理函数的结构元素。
Mat getStructuringElement(int shape, //形状Size ksize, //尺寸Point anchor = Point(-1, -1) //锚点);
- 参数 shape 是枚举变量 enum cv::MorphShapes
1.2 morphologyEx
OpenCV官方文档morphologyEx链接
- 这其实是一个非常强大的函数,它可以通过调整参数 op 完成八种操作:腐蚀、膨胀、开运算、闭运算、顶帽、黑帽、梯度、击中击不中。
void morphologyEx(InputArray src, OutputArray dst,int op, InputArray kernel,Point anchor = Point(-1, -1),int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue());
- 参数 op 是枚举变量 enum cv::MorphTypes
- 对于腐蚀和膨胀,OpenCV还有专门的函数 erode 和 dialte,它们和 morphologyEx 使用 MORPH_ERODE 或 MORPH_DILATE 是完全相同的。
- 所有操作都支持就地调用。对于多通道图像,每个通道是被独立处理的。
- borderType :不支持BORDER_WRAP
- 《学习OpenCV3》有这样的描述:尽管开和闭操作的效果与腐蚀相近,但这些新操作在保持连通域的精度上更加可靠。
1.3 erode
void erode(InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1, -1), int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue());
1.4 dilate
void dilate(InputArray src, OutputArray dst, InputArray kernel,Point anchor = Point(-1, -1),int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue());
2. 例程
2.1 图像处理效果
原图
二值化图像
对二值化图像进行腐蚀、膨胀、开操作、闭操作
- 开操作和闭操作实际上就是腐蚀和膨胀的简单组合。
- 开操作是先腐蚀后膨胀,常用于对二值图像中的区域进行计数。
- 闭操作是先膨胀后腐蚀,作用于复杂连通分支算法中减少无用或噪声驱动的片段。对于连通分支,通常先进行腐蚀或闭操作消除噪声,然后通过开操作连接相互靠近的大型区域。
- 尽管开和闭操作的效果与腐蚀相近,但这些新操作在保持连通域的精度上更加可靠。
梯度图
- 形态学梯度 是 膨胀操作的结果(扩张亮域)减 腐蚀操作的结果(缩减亮域) ,这就是边缘。
- 对于灰度图,其结果就是计算明暗变换的趋势。形态学梯度通常用于显示明亮区域的边界,然后便可以将他们看做目标或者目标的部分。用扩张的图像减去了收缩的图像,如此一来就找出了完整的边界。这与计算梯度不同,它不会关注某一个物体的周围。
顶帽和黑帽
- 这两种操作分别用于显示与其邻域相比更亮或更暗的部分。当试图根据物体的亮度变化分离依附于物体的某些部分时,就会用到这些方法。
- 顶帽作用源图像减去其开操作后的图像。开操作的效果是放大裂缝和局部小洞。因此用源图像减去开操作后的图像得到了比源图像更亮的环绕部分。
- 黑帽操作显示的是比源图像更暗的环绕部分。
击中击不中
2.2 代码
#include "stdafx.h"
#include <opencv.hpp>
using namespace cv;
int main()
{Mat m_SrcImg = imread("./1.jpg", IMREAD_GRAYSCALE);imshow("原图", m_SrcImg);//阈值化操作Mat m_SrcImg2;threshold(m_SrcImg, m_SrcImg2, 100, 255, THRESH_BINARY_INV);imshow("原图2", m_SrcImg2);Mat m_DstImg;Mat elementRect = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1));Mat elementEllipse = getStructuringElement(MORPH_ELLIPSE, Size(5, 5), Point(-1, -1));int m_nIterations = 1;//腐蚀morphologyEx(m_SrcImg2, m_DstImg, MORPH_ERODE, elementEllipse, Point(-1, -1), m_nIterations);imshow("MORPH_ERODE", m_DstImg);//膨胀morphologyEx(m_SrcImg2, m_DstImg, MORPH_DILATE, elementEllipse, Point(-1, -1), m_nIterations);imshow("MORPH_DILATE", m_DstImg);//开操作morphologyEx(m_SrcImg2, m_DstImg, MORPH_OPEN, elementEllipse, Point(-1, -1), m_nIterations);imshow("MORPH_OPEN", m_DstImg);//闭操作 morphologyEx(m_SrcImg2, m_DstImg, MORPH_CLOSE, elementEllipse, Point(-1, -1), m_nIterations);imshow("MORPH_CLOSE", m_DstImg);//梯度 如果是空的Mat,则会被默认为是3×3的核morphologyEx(m_SrcImg2, m_DstImg, MORPH_GRADIENT, Mat(), Point(-1, -1), m_nIterations);imshow("MORPH_GRADIENT", m_DstImg);//顶帽 这里我使用了一个Mat的构造函数,自行创建了掩码,同样也可以作为形态学操作函数的结构化元素来使用 morphologyEx(m_SrcImg, m_DstImg, MORPH_TOPHAT, Mat(Size(11, 11), m_SrcImg.type()), Point(-1, -1), m_nIterations);imshow("MORPH_TOPHAT", m_DstImg);//黑帽 morphologyEx(m_SrcImg, m_DstImg, MORPH_BLACKHAT, Mat(Size(11, 11), m_SrcImg.type()), Point(-1, -1), m_nIterations);imshow("MORPH_BLACKHAT", m_DstImg);//击中击不中morphologyEx(m_SrcImg2, m_DstImg, MORPH_HITMISS, elementEllipse, Point(-1, -1), 1);imshow("MORPH_HITMISS", m_DstImg);waitKey(0);return 0;
}
OpenCV morphologyEx、erode、dilate、getStructuringElement (形态学算子)相关推荐
- opencv for python的图像梯度算子以及canny边缘检测
opencv for python的图像梯度算子以及canny边缘检测 一.图像梯度算子: 二.Canny边缘检测(一个多级边缘检测算法): 一.图像梯度算子: 1.概念简介(部分引自百度百科): 图 ...
- OpenCV-Python教程:形态学变换~腐蚀和膨胀(erode,dilate)
原文链接:http://www.juzicode.com/opencv-python-erode-dilate 返回Opencv-Python教程 形态学变换是基于图像形状的变换过程,通常用来处理二值 ...
- (_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用
1.腐蚀 概述:腐蚀掉图像的细节.若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除. 下面所说的"值"可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高. ...
- OPenCV膨胀函数dilate()的使用
OPenCV版本:4.4 IDE:VS2017 功能描述 简述:使用一个指定的核元素去膨胀一个图像,图像膨胀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所 ...
- Python-Opencv 形态学+算子实现轮廓提取
1. 形态学 图像的形态学操作主要是腐蚀和膨胀,在原理上就是结构元和原图进行卷积操作,只不过原始卷积是进行计算,而腐蚀和膨胀是看结构元覆盖范围内1的情况. 1.1. 腐蚀与膨胀定义 腐蚀定义:若结构元 ...
- Opencv学习笔记四——图像形态学操作
需要的库和自定义函数 import cv2 import numpy as np import matplotlib.pyplot as pltdef cv_show(name, mat):cv2.i ...
- OpenCV图像处理(2)——形态学操作
形态学操作 Mat element = getStructuringElement(MORPH_RECT, Size(9, 9)); morphologyEx(InputImage, OutputIm ...
- opencv中的cv2.getStructuringElement()
cv2.getStructuringElement( ) 返回指定形状和尺寸的结构元素. 这个函数的第一个参数表示内核的形状,有三种形状可以选择. 矩形:MORPH_RECT; 交叉形:MORPH_C ...
- c++gdal如何在大图像中截取小图像并获取其图像信息_【图像处理】OpenCV系列十 --- 边缘检测之Canny算子...
上一篇我们学习了图像处理形态学相关知识点,相信大家学习之后已经对形态学有了足够的理解了,那么接下来,我们一起来学习一下图像处理中的边缘检测吧!我们将会重点学习边缘检测各种算子和滤波器 --- Cann ...
最新文章
- SpringCloud相关概念介绍
- Flutter 日期选择器与时间选择器
- windows tcp端口占满_TCP与UDP分析、三次握手四次断开、DDOS
- mysql语句大全(2)
- Angular 字符串替换
- 服务器文件怎么清理,文件传输服务器怎么清理内存
- C++和数据结构考试总结
- 安卓tv html,Emby for Android TV
- Emitter使用方法
- ubuntu播放不了本地视频
- SAP调用外围系统接口SXI_MONITOR有显示但是实际上没有调用接口的问题
- Logcat五种级别日志
- Python趣味篇:字符串中的趣味瞬间
- python处理时序数据总结
- yolov7运行自己的VOC格式数据集
- Arduino教程-11. PIR传感器
- ue4 改变枢轴位置_UE4虚幻引擎学习云笔记(五)-静态网格体编辑器
- 转载:天涯——散文天下——《劳动力短缺》——作者:南方孤驴
- android ext4 损坏,EXT4文件系统损坏导致的实例无法启动的排查与修复
- 可上网Linux,可以上网了