形态学应用
OpenCV4没有提供只用于图像开运算的函数,而是提供了图像腐蚀和膨胀运算不同组合形式的morphologyEx()函数
以实现图像的开运算、闭运算、形态学梯度、顶帽运算、黑帽运算,以及击中击不中变换
morphologyEx()函数原型:
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()
)
- src:输入图像,图像通道数任意,但图像数据类型必须是CV_8U、CV_16U、CV_16S、CV_32F或CV_64F之一
- dst:形态学操作后的输出图像,与输入图像src具有相同的尺寸和数据类型
- op:形态学操作类型的标志
- kernel:结构元素,可以自己定义,也可以用getStructuringElement()函数生成
- anchor:中心点的位置,默认为结构元素的几何中心
- iterations:处理的次数,默认值为1
- borderType:像素外推选择标志,默认为BORDER_DEFAULT,表示不包含边界值的倒序填充(2.3.4仿射变换)
- borderValue:使用边界不变外推法时的边界值
该函数根据结构元素对输入图像进行多种形态学操作,在处理多通道图像时,每个通道独立进行处理
第三个参数是形态学操作类型的标志,可以选择的有开运算、闭运算、形态学梯度、顶帽运算、黑帽运算,以及击中击不中变换
第四、五个参数都是与结构元素相关的参数
第四个参数是结构元素,使用的结构元素尺寸越大,效果越明显
第五个参数是结构元素的中心位置,默认值为Point(-1,-1)、
第六个参数是处理次数,处理次数越多,效果越明显
最后两个参数对图像主要部分的形态学操作没有影响,多数情况下使用默认值
morphologyEx()函数中形态学操作类型的标志及其含义
| 标志参数 | 简记 | 作用 |
|---|---|---|
| MORPH_ERODE | 0 | 图像腐蚀 |
| MORPH_DILATE | 1 | 图像膨胀 |
| MORPH_OPEN | 2 | 开运算 |
| MORPH_CLOSE | 3 | 闭运算 |
| MORPH_GRADIENT | 4 | 形态学梯度 |
| MORPH_TOPHAT | 5 | 顶帽运算 |
| MORPH_BLACKHAT | 6 | 黑帽运算 |
| MORPH_HITMISS | 7 | 击中击不中运算 |
示例:
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
//用于验证形态学应用的二值化矩阵
Mat src = (Mat_<uchar>(9,12) << 0,0,0,0,0,0,0,0,0,0,0,0,
0,255,255,255,255,255,255,255,0,0,255,0,
0,255,255,255,255,255,255,255,0,0,0,0,
0,255,255,255,255,255,255,255,0,0,0,0,
0,255,255,255,0,255,255,255,0,0,0,0,
0,255,255,255,255,255,255,255,0,0,0,0,
0,255,255,255,255,255,255,255,0,0,255,0,
0,255,255,255,255,255,255,255,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0);
namedWindow("src",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("src",src);
//3x3矩形结构元素
Mat kernel = getStructuringElement(0,Size(3,3));
//对二值化矩形进行形态学操作
Mat open,close,gradient,tophat,blackhat,hitmiss;
//对二值化矩阵进行开运算
morphologyEx(src,open,MORPH_OPEN,kernel);
namedWindow("open",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("open",open);
//对二值化矩阵进行闭运算
morphologyEx(src,close,MORPH_CLOSE,kernel);
namedWindow("close",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("close",close);
//对二值化矩阵进行形态学梯度运算
morphologyEx(src,gradient,MORPH_GRADIENT,kernel);
namedWindow("gradient",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("gradient",gradient);
//对二值化矩阵进行顶帽运算
morphologyEx(src,tophat,MORPH_TOPHAT,kernel);
namedWindow("tophat",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("tophat",tophat);
//对二值化矩阵进行黑帽运算
morphologyEx(src,blackhat,MORPH_BLACKHAT,kernel);
namedWindow("blackhat",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("blackhat",blackhat);
//对二值化矩阵进行击中击不中运算
morphologyEx(src,hitmiss,MORPH_HITMISS,kernel);
namedWindow("hitmiss",WINDOW_GUI_NORMAL); //可以自由调节显示图像的尺寸
imshow("hitmiss",hitmiss);
waitKey(0);
return 0;
}