OpenCV(C++) 基础(三)-- 形态学操作/漫水填充/二值化

1.形态学操作

// 形态学核,矩形,5x5大小
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
// getStructuringElement(shape, Size(a, b)); 
// shape: MORPH_RECT, MORPH_CROSS, MORPH_ELLIPSE

// 腐蚀:黑色区域腐蚀白色区域,去噪,孔洞填充
morphologyEx(src, dst, MORPH_OPEN, element); // <==> erode(src, dst, element);

// 膨胀:白色区域扩张,连接分割的区域
morphologyEx(src, dst, MORPH_CLOSE, element); // <==> dilate(src, dst, element);

// 开运算:先腐蚀后膨胀(消除细小物体,分离连通域)
morphologyEx(src, dst, MORPH_OPEN, element); // <==> dialte(erdoe(src, element);

// 闭运算:线膨胀后腐蚀(孔洞填充,连接连通域) 
morphologyEx(src, dst, MORPH_CLOSE, element); // <==> erode(dilate(src, element);

// 形态学梯度(morphological gradient):膨胀图 - 腐蚀图 (得到轮廓)
morphologyEx(src, dst, MORPH_GRADIENT, element); // <==> dilate(src, element) - erode(src, element)

// 顶帽:原图 - 开运算图(分离区域周边亮部)
morphologyEx(src, dst, MORPH_TOPHAT, element); // <==> src - open(src, element)

// 黑帽:原图 - 闭运算图 (分离区域周边暗部)
morphologyEx(src, dst, MORPH_BLACKHAT, element); // <==> src - close(src, element)

2.满水填充(floodFill):查找和种子点联通的颜色相同的点

填充连通区域:通过设置可连通像素的上下限及连通方式来达到不同的填充效果的方法。通常用于标记或分离图像的一部分。

// Paras: Mat, Point, Scalar, Scalar, Scalar, int
int floodFill(src, seedPoint, newVal, loDiff, upDiff, flag);
// seedPoint: 种子坐标,填充起始点
// newVal: 染色的像素值
// lowDiff: 周围像素与种子像素亮度负差最大值
// highDiff: 周围像素与种子像素亮度正差最大值
// flag: 高中低各8位,分别控制连通性、指定掩码值等
Mat src = imread("1.jpg");
Rect ccomp;
floodFill(src, Point(50, 300), Scalar(155,255,55),
          &ccomp, Scalar(20,20,20), Scalar(20,20,20));

3.尺寸调整: resize()

// src, dst: 输入输出,Mat格式
// dsize:Size()格式,输出图像尺寸
// fx, fy: 沿水平、垂直方向缩放系数,默认值为0
// interpolot: 插值方式,默认为INTER_LINERAR
// 插值方式:缩小(CV_INTER_AERA)、放大(CV_INTER_CUBIC / CV_INTER_LINEAR)
void resize(src, dst, disze, fx, fy, interpolation);
// case:
resize(src, src, Size(src.cols/2, src.rows/2), (0, 0), (0, 0), CV_INTER_AERA);

4.阈值二值化:将灰度图像二值化

threshold():

double theshold(src, dst, double thresh, double maxVal, int type);
// thresh: 阈值, maxVal:阈值最大值
// type: 常用的有THRESH_BINARY和THRESH_BINARY_INV两种
// case:
threshold(src, dst, 127, 255, THRESH_BINARY);

adaptiveThreshod():

// adaptiveMethod: 算法种类,ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
// blockSize: 邻域尺寸,3、5、7、...
// C: 常量
void adaptiveThreshold(src, dst, maxVal, int adativeMethod, int type, blockSize, double C);

大津法(自适应,基于类内最大方差):

threshold(gray, dst, 0, 255, CV_THRESH_OTSU);
// 取反
threshold(gray, dst, 0, 255, CV_THRESH_OTSU + THRESH_BINARY_INV);

猜你喜欢

转载自blog.csdn.net/francislucien2017/article/details/81028005
今日推荐