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

2021/10/5 1:12:02

本文主要是介绍OpenCV(C++)学习笔记(二)----二值图像处理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

文章目录

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

阈值化

请添加图片描述

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阈值法

算法流程为:

请添加图片描述

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

现在任意选取一个灰度值 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

Triangle阈值法—三角法

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

请添加图片描述

当α和β值都为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++)学习笔记(二)----二值图像处理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程