形态学应用

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;
}

results matching ""

    No results matching ""