随着机器视觉和图像处理技术的发展,在工业和生活中都应用广泛。传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开,学习了***贾志刚老师***的OpenCV对象提取与计数课程,现复盘整理如下。
1、方案思路
- 图像预处理,二值化分割;
- 使用形态学操作,初步将粘连对象分开;
- 距离变换,分离粘连对象;
- 连通区域计数。
2、重要函数
全局二值化分割:
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
第一个参数,InputArray类型的src,输入数组,填单通道 , 8或32位浮点类型的Mat即可。
第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。
第三个参数,double类型的thresh,阈值的具体值。
第四个参数,double类型的maxval,当第五个参数阈值类型,可取如下值:
THRESH_BINARY=0,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV,THRESH_OTSU,THRESH_TRIANGLE,THRESH_MASK
其中THRESH_OTSU方法在图像灰度中具有明显双峰时,分割效果非常好,自动计算阈值。THRESH_TRIANGLE方法在两个峰值不明显情况下,使用三角形计算方法,本例程使用该种方法,示意图如下:

局部二值化分割:
void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C)
参数如下:
InputArray src:源图像
OutputArray dst:输出图像,与源图像大小一致
int adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
int thresholdType:这是阈值类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV
int blockSize:adaptiveThreshold的计算单位是像素的邻域块,邻域块取多大,就由这个值作决定
double C:这个参数实际上是一个偏移值调整量
从上面的说明中可以看出,使用函数adaptiveThr

最低0.47元/天 解锁文章
2432





