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