在灰度图像中应用形态学运算 - sumpig/OpenCV GitHub Wiki
形态学梯度
一种检测图像边缘的简单方法,即通过计算膨胀后的图像与腐蚀后的图像之间的的差距得到边缘。因为这两种转换后图像的差别主要在边缘地带,所以 相减后会突出边缘。在cv::morphologyEx 函数中输入cv::MORPH_GRADIENT 参数,即可实现此功能。显然,结构元素越大,检测到的边缘就越宽。这种边缘检测运算称为 Beucher 梯度。
还有两种简单的方法能得到类似结果,即用膨胀后的图像减去原始图像,或者用原始图像减去腐蚀后的图像,那样得到的边缘会更窄。
// 用 3×3 结构元素得到梯度图像
cv::Mat result;
cv::morphologyEx(image, result,
cv::MORPH_GRADIENT,
cv::Mat());
顶帽变换
顶帽运算使用了开启和闭合运算。因为灰度图像进行形态学开启运算时会先对图像进行腐蚀,局部的尖锐部分会被消除,其他部分则将保留下来。因此,原始图像和经过开启运算的图像的比对结果就是局部的尖锐部分。这些尖锐部分就是我们需要提取的前景物体。
黑帽算法将对图像做闭合运算,然后从得到的结果中减去原始图像。
// 使用7×7 结构元素做黑帽变换
cv::Mat element7(7, 7, CV_8U, cv::Scalar(1));
cv::morphologyEx(image, result,
cv::MORPH_BLACKHAT,
element7);