morphology:形态学,morphologyEx=morphology Expend。MORPH为形态学缩写,MORPH_CLOSE形态学闭操作
开操作:先腐蚀后膨胀
闭操作:先膨胀后腐蚀
形态学梯度:膨胀减去腐蚀。
顶帽:原图像与开操作图像之间的差值图像。
黑帽:闭操作图像与原图像之间的差值图像。
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() );
参数含义如下;
(1)InputArray类型的src,输入图像。通道数可以任意,但深度应为CV_8U、CV_16U、CV_16S、CV_32F或CV_64F之一。
(2)OutputArray类型的dst,即目标图像,与输入图像有相同的尺寸和类型。
(3)int类型的op,形态学操作的类型,请参见cv::MorphTypes
(4)InputArray类型的kernel,用于膨胀的结构元素;如果elemenat=Mat(),则使用3 x 3矩形结构元素。可以使用getStructuringElement创建内核。
(5)Point类型的anchor:锚定在元素中的位置;默认值(-1,-1)表示锚定在元素中心。
(6)int类型的iterations:应用膨胀的次数。
(7)int类型的borderType:像素外推方法,参见cv::BorderTypes。
注意:在使用过程中,只需要设置前四个参数,后面的参数默认即可。
#include
#include
using namespace std;
using namespace cv;
int main()
{
Mat src, dst;
src = imread("D:/images/box.jpg");
if (src.empty())
{
cout << "could not load image !";
return -1;
}
imshow("原图", src);
//getStructuringElement:构造结构元素,MORPH_RECT:表示矩形结构区域,长和宽尺寸都为7.
Mat kernel = getStructuringElement(MORPH_RECT, Size(7, 7), Point(-1, -1));
//闭操作
morphologyEx(src, dst, MORPH_CLOSE, kernel);
imshow("闭操作", dst);
//开操作
morphologyEx(src, dst, MORPH_OPEN, kernel);
imshow("开操作", dst);
//形态学梯度
morphologyEx(src, dst, MORPH_GRADIENT, kernel);
imshow("gradient", dst);
//顶帽
morphologyEx(src, dst, MORPH_TOPHAT, kernel);
imshow("顶帽", dst);
//黑帽
morphologyEx(src, dst, MORPH_BLACKHAT, kernel);
imshow("黑帽", dst);
waitKey(0);
return 0;
}