Hellow,我是jack,今天给大家分享的是形态学开运算闭运算。话不多说,让我们直接进入正题。首先让我们先介绍一下什么是开运算,什么是闭运算。
开运算-----先通过腐蚀运算再进行膨胀运算从而实现将图像中目标物的分割。
开运算是物体较背景明亮时能够排除小区域物体,消除高于邻近点的孤立点,达到去噪的作用,可以平滑物体轮廓,断开较窄的狭颈。
闭运算------先通过膨胀处理再进行腐蚀运算从而实现将图像中细微连接的图块连在一起。
闭运算能够排除小型黑洞(黑色区域),消除低于邻近点的孤立点,达到去噪的作用,可以平滑物体,使轮廓更加清晰,弥合较窄的间断和细长的沟壑,消除小孔洞,填补轮廓线中的断裂。
double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
参数信息:
第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
第三个参数,double类型的thresh,阈值的具体值。
第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
第五个参数,int类型的type,阈值类型。
double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );
参数信息:
第四个参数,double类型的maxval,当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值.
第五个参数,int类型的type,阈值类型。
0: THRESH_BINARY 当前点值大于阈值时,取Maxval,也就是第四个参数,否则设置为0
1: THRESH_BINARY_INV 当前点值大于阈值时,设置为0,否则设置为Maxval
2: THRESH_TRUNC 当前点值大于阈值时,设置为阈值,否则不改变
3: THRESH_TOZERO 当前点值大于阈值时,不改变,否则设置为0
4: THRESH_TOZERO_INV 当前点值大于阈值时,设置为0,否则不改变
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() );
op:操作的类型,总共有以下几种类型:
enum MorphTypes{
MORPH_ERODE = 0, //腐蚀
MORPH_DILATE = 1, //膨胀
MORPH_OPEN = 2, //开操作 先腐蚀后膨胀的操作
MORPH_CLOSE = 3, //闭操作 先膨胀后腐蚀的操作
MORPH_GRADIENT = 4, //梯度操作
MORPH_TOPHAT = 5, //顶帽操作
MORPH_BLACKHAT = 6, //黑帽操作
MORPH_HITMISS = 7
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() );
kernel:用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
anchor:参考点,其默认值为(-1,-1)说明位于kernel的中心位置。
borderType :边缘类型,默认为BORDER_CONSTANT。
borderValue :边缘值,用它的默认值即可。结构元素获取:
MORPH_RECT //创建一个矩形结构元素大小为3*3
MORPH_CROSS //十字型
MORPH_ELLIPSE //椭圆型
// 阈值化
cv::threshold(srcGray, segImage,255 * (0.5), 255, cv::THRESH_BINARY);
// 定义结构元素
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE,cv::Size(3,5));
// 形态学闭操作
cv::Mat closedMat;
cv::morphologyEx(segImage,closedMat,cv::MORPH_CLOSE,element);
// 形态学开操作
cv::Mat openedMat;
cv::morphologyEx(segImage, openedMat,cv::MORPH_OPEN, element);
#include
#include
#include
#include
using namespace std;
using namespace cv;
int main() {
cv::Mat image2 = cv::imread("D:\\桌面\\test.tif");
cv::Mat segDst, image1;
cv::cvtColor(image2, image1, CV_BGR2GRAY);
//阈值化
cv::threshold(image1, segDst, 255 * (0.5), 255, THRESH_BINARY_INV);
// 定义结构元素
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(3, 5));
// 形态学闭操作
cv::Mat closedMat;
cv::morphologyEx(segDst, closedMat, cv::MORPH_CLOSE, element);
// 形态学开操作
cv::Mat openedMat;
cv::morphologyEx(segDst, openedMat, cv::MORPH_OPEN, element);
cv::imshow("scr", image1);
cv::imshow("seg", segDst);
cv::imshow("closedMat", closedMat);
cv::imshow("openedMat", openedMat);
cv::waitKey(0);
return 0;
}
本章就和大家分享到这里,谢谢。