阈值二值化 cv:threshold
输入为灰度图像
threshold(src, dst, 127, 255, THRESH_BINARY);
reshold(src //输入
dst //输出
thresh //阈值
maxValue //二值化最大值
thresholdType //阈值类型 CV_THRESH_OTSU
)
自适应阈值 cv::adaptiveThreshold
adaptiveThreshold(gray, dst2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5,8); //自适应阈值,高斯分布 5*5. 阈值为高斯均值-8
adaptiveThreshold(
InputArry src,
OutputArrt dst,
double maxValue //设置最大值
int adaptiveMethod //均值或高斯取值
//ADAPTIVE_THRESH_MEAN_C
//ADAPTIVE_THRESH_GAUSSIAN_C
int thresholdType //阈值类型
int blockSize //方框边长 为奇数
double C //阈值未取高斯阈值-C
}
平滑与滤波
简单模糊 blur
blur(mat, img_blur, Size(11, 11), Point(-1, -1));//均值模糊
void blur(
InpurArry src,
OutputArry dst,
Size Ksize //模糊盒装块大小
Point anchor //核的位置一般未Point(-1,-1),表示居中
int borderType //一般不输入
)
高斯模糊 GaussianBlur
GaussianBlur(mat, img_gar, Size(11, 11), 11, 11);
void GaussianBlur(
InpurArry src,
OutputArry dst,
Size Ksize //模糊盒装块大小
double sigmaX //X方向方差
double sigmaY //Y方向方差
int borderType //没用
)
中值滤波器(去除黑白点)
medianBlur(src, dst, 11);
void medianBlur(InputArray src, OutputArray dst, int ksize);//ksize方块边长
双边滤波器(边缘保留) bilateralFilter
边界在,细节被滤去
bilateralFilter(src, dst, 15, 150, 3);
//15计算半径, 150 决定多少差值之内的像素会被计算,3如果d大于0则无效,否则用他来计算d的值
//边缘保留的滤波算法
void bilateralFilter(InputArray src, OutputArray dst,
int d, //半径
double sigmaColor, //颜色权重函数的宽度参数,差值之内的被计算
double sigmaSpace, //空间权函数的宽度参数
int borderType = BORDER_DEFAULT
);
任意线性滤波器做卷积
每一个图元与算子进行卷积来达到滤波的目的
Robert算子:45度方向求导数
Sobel算子:x y方向求导数
拉普拉斯算子:全导数
卷积函数:
void filter2D( InputArray src, OutputArray dst,
int ddepth, //深度,不知道的写 -1
InputArray kernel, //卷积算子
Point anchor = Point(-1,-1),
double delta = 0, int borderType = BORDER_DEFAULT );
索贝尔函数:
Sobel( InputArray src, OutputArray dst, int ddepth,
int dx, int dy, //求导顺序取值0 1 2,0表示不求导
int ksize = 3,
double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
拉普拉斯变换函数 (二次求导取出边缘)
void Laplacian( InputArray src, OutputArray dst, int ddepth,
int ksize = 1, double scale = 1, double delta = 0,
int borderType = BORDER_DEFAULT );
图像形态学
膨胀与腐蚀
目标像素点的值替换为卷积核覆盖区域 的局部最大(小)值
先获得核 getStructuringElement
Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
//ship MORPH_RECT(一般是)(长方形) \MORPH_CROSS\MORPH_ELLIPSE
//esize 如Size(s*s) s为奇数,指的是卷积核覆盖区域大小
//锚点默认Point(-1, -1))指中心
膨胀 dilate
dilate(src, dst, structure, Point(-1, -1));
void dilate(InputArray src, OutputArray dst, //输入输出
InputArray kernel, //输入核
Point anchor = Point(-1, -1), int iterations = 1,
int borderType = BORDER_CONSTANT, //暂时没用,不用输入
const Scalar& borderValue = morphologyDefaultBorderValue() //暂时没用,不用输入
);
腐蚀 erode
erode(src, dst, structure, Point(-1, -1));//同膨胀
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
形态学操作:
CV_MOP_OPEN | 开操作 | 先腐蚀,后膨胀,可以去掉小的对象。 |
CV_MOP_CLOSE | 闭操作 | 先膨胀,后腐蚀,可以填充小的洞。 |
CV_MOP_GRADIENT | 形态学梯度 | 膨胀减去腐蚀 gradient(src)=dilate(src)-erode(src),高亮图中变化剧烈的部分 |
CV_MOP_TOPHAT | 顶帽 | 原图像与开操作图像的差值,明亮的局部(黑线条的背光)被提取出来 |
CV_MOP_BLACKHAT | 黑帽 | 闭图像与原图像的差值,暗洞(黑线条)被提取出来 |
void morphologyEx( InputArray src, OutputArray dst,
int op, //选择形态学操作,如开操作 CV_MOP_OPEN ,闭操作CV_MOP_CLOSE
InputArray kernel,//输入结构元素,图元
Point anchor = Point(-1,-1), //位置,默认中心
int iterations = 1, //迭代次数,默认1
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );