OpenCV形态学运算

1.OpenCV形态学运算morphologyEx开运算 、闭运算 、形态学梯度 、顶帽运算 、黑帽运算 、腐蚀运算 、膨胀运算 、击中击不中运算

 

void cv::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()

)  

 

InputArray src: 输入图像,可以是Mat类型,对于图像通道数无要求,但图像深度必须是CV_8UCV_16UCV_16SCV_32FCV_64F 
. OutPutArray dst: 
目标图像,与原图像尺寸核类型相同 
. int op: 形态学运算的类型,可以通过MorphTypes查看,如下所示: 
标识符 | 运算类型 
MORPH_OPEN 开运算 
MORPH_CLOSE :闭运算 
MORPH_GRADIENT 形态学梯度 
MORPH_TOPHAT:顶帽运算 
MORPH_BLACKHAT 黑帽运算 
MORPH_ERODE :腐蚀运算 
MORPH_DILATE :膨胀运算 
MORPH_HITMISS: 击中击不中运算(只支持CV_8UC1类型的二值图像)

. InputArray kernel: 形态学运算的内核,如果是Mat()则表示的是参考点位于内核中心3x3的核,前面也提到一般使用前需要定义一个Mat变量结合getStructuringElement()函数使用,getStructuringElement会返回指定形状和尺寸的结构元素,这里再重申一下getStructuringElement的参数,其函数原型如下:

Mat cv::getStructuringElement   (   int     shape,

        Size    ksize,

        Point   anchor = Point(-1,-1)

)

int shape: kernel的形状,由cv::MorphShapes指定,如下:

 

分别是矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形(MORPH_ELLIPSE) 
. Size ksize: kernel
的尺寸 
. Point anchor = Point(-1, -1): 锚点位置

. Point anchor=Point(-1, -1): 锚点位置 
. int iterations=1: 迭代使用函数的次数,默认值为
. int borderType=BORDER_CONSTANT:
用于推断图像外部像素的某种边界模式,有默认值BORDER_CONSTANT 
. const Scalar & borderValue=morphologyDefaultBorderValue():
当边界为常数时的边界值,可以通过createMorphologyFilter() 查看更多细节。

这些形态学操作都是可执行就地操作(in-place),对于多通道图像,每个图像通道进行单独操作。

 

 

2.示例

 

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>

 

using namespace std;

using namespace cv;

 

int main()

{

       Mat srcImage = cv::imread("1.png", 1);

       if (!srcImage.data)

              return 1;

       Mat srcGray;

       cvtColor(srcImage, srcGray, CV_BGR2GRAY);

       // 定义结构元素

       Mat element = getStructuringElement(

              MORPH_RECT, Size(15, 15));

       Mat topHatMat, blackHatMat;

       // 形态学Top-Hat 顶帽

       morphologyEx(srcGray, topHatMat,

              MORPH_TOPHAT, element);

       // 形态学Top-Hat 黑帽

       morphologyEx(srcGray, blackHatMat,

              MORPH_BLACKHAT, element);

       Mat Object_img;

       Object_img = srcGray + topHatMat - blackHatMat;

       imshow(" srcGray ", srcGray);

       imshow(" topHatMat  ", topHatMat);

       imshow(" blackHatMat ", blackHatMat);

       imshow(" Object_img ", blackHatMat);

       waitKey(0);

       return 0;

}

 

猜你喜欢

转载自blog.csdn.net/caomin1hao/article/details/81202274