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_8U、CV_16U、CV_16S、CV_32F或CV_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: 迭代使用函数的次数,默认值为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;}