OpenCV中阈值函数
double cv::threshold(InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type)
OpenCV种自适应阈值函数
void cv::adaptiveThreshold(InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C)
tips:进行自动阈值寻找时输入图像为灰度图,手动阈值寻找时可为三通道图
算法流程为:
其中类内方差的计算方法为:
现在任意选取一个灰度值 t,则可以将这个直方图分成前后两部分。这两部分分别为 a 和 b。对应的就是前景和背景。这两部分各自的平均值成为 Ma 和 Mb。a部分里的像素数占总像素数的比例记作 Pa,b部分里的像素数占总像素数的比例记作 Pb。
则类间方差定义为:
I C V = P a ∗ ( M a − M ) 2 + P b ∗ ( M b − M ) 2 ICV=Pa∗(Ma−M)2+Pb∗(Mb−M)2 ICV=Pa∗(Ma−M)2+Pb∗(Mb−M)2
先构建出灰度直方图,然后把最高点和右侧最低点做辅助线连接起来,如下图
当α和β值都为45°,直线d与做的辅助线垂直时该点对应的灰度值为阈值T
腐蚀定义:
用结构元素窗口区域的最小像素值替代中心像素值
void cv::erode(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
)
其中kernel为结构元素,iteration为执行腐蚀的次数
膨胀定义:
用结构元素窗口区域的最大像素值替代中心像素值
void cv::dilate(InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
)
其中kernel为结构元素,iteration为执行腐蚀的次数
开运算:对图像执行先腐蚀后膨胀操作
开运算=腐蚀+膨胀(op=MORPH_OPEN)
闭运算:对图像执行先膨胀后腐蚀操作
闭运算:膨胀+腐蚀(op=MORPH_CLOSE)
void cv::morphologyEx(InputArray src,
OutputArray dst,
int op,
InputArray kernel,
Point anctor=Point(-1,-1),
int iteration=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
)
开运算:
先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
闭运算:
先膨胀,再腐蚀,可清除小黑点
1.对输入图像进行扫描,扫描到前景像素时进行标记
2.寻找相邻像素的标记(上方和左侧),若有标记则该像素标记为相邻像素一样的标记。若相邻的标记不同则标记为较小的
3.将连通区域的标记统(第一个联通区域全部像素标记为1,第二个区域全部标记为2等等)
int cv::connectedComponents (
cv::InputArrayn image, // input 8-bit single-channel (binary)
cv::OutputArray labels, // output label map
int connectivity = 8, // 4- or 8-connected components
int ltype = CV_32S // Output label type (CV_32S or CV_16U)
)
int cv::connectedComponentsWithStats (
cv::InputArrayn image, // input 8-bit single-channel (binary)
cv::OutputArray labels, // output label map
cv::OutputArray stats, // Nx5 matrix (CV_32S) of statistics:
// [x0, y0, width0, height0, area0;
// ... ; x(N-1), y(N-1), width(N-1),
// height(N-1), area(N-1)]
cv::OutputArray centroids, // Nx2 CV_64F matrix of centroids:
// [ cx0, cy0; ... ; cx(N-1), cy(N-1)]
int connectivity = 8, // 4- or 8-connected components
int ltype = CV_32S // Output label type (CV_32S or CV_16U)
)
OpenCV中的轮廓提取函数
void cv::findContours(InputOutputArray image,
OutputArrayOfArrays contours,//vector
OutputArray hierarchy,//层次信息
int mode,
int method,//提取轮廓的方式
Point offset=point())
Blob定义:Blob是图像中一组相互连通的像素点,它们具有一些共通的属性。