OpenCV(C++)学习笔记(二)----二值图像处理

OpenCV(C++)学习笔记(二)----二值图像处理

文章目录

  • OpenCV(C++)学习笔记(二)----二值图像处理
    • 阈值化
      • 自适应方法
        • OTSU阈值法
        • Triangle阈值法—三角法
    • 腐蚀与膨胀
      • 腐蚀
      • 膨胀
    • 开运算与闭运算
    • 连通区域分析
      • 两步法
    • 轮廓
    • Blob检测

阈值化

OpenCV(C++)学习笔记(二)----二值图像处理_第1张图片

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:进行自动阈值寻找时输入图像为灰度图,手动阈值寻找时可为三通道图

自适应方法

OTSU阈值法

算法流程为:

OpenCV(C++)学习笔记(二)----二值图像处理_第2张图片

其中类内方差的计算方法为:

现在任意选取一个灰度值 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(MaM)2+Pb(MbM)2

Triangle阈值法—三角法

先构建出灰度直方图,然后把最高点和右侧最低点做辅助线连接起来,如下图

OpenCV(C++)学习笔记(二)----二值图像处理_第3张图片

当α和β值都为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定义:Blob是图像中一组相互连通的像素点,它们具有一些共通的属性。

你可能感兴趣的:(opencv,c++)