前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力.

  视觉领域的斑点检测的主要思路是检测出图像中比周围像素灰度打或者比周围区域灰度值小的区域,一般来说,有两种基本方法

  1.基于求导的微分方法,这成为微分检测器

  2.基于局部极值的分水岭算法,OPENCV中提供了simpleBlobDetector特征检测器来实现这种基本的斑点检测算法.

  

  LOG斑点检测

  使用高斯拉普拉斯算子检测图像斑点是一种比较常见的办法,对一个二维的高斯函数G(x,y,o),进过规范化的拉普拉斯变换以后,结果在二维图像上呈现为一个圆对称函数,我们可以用这个函数来检测图像的斑点,并且可以通过改动o的值

来检测不同尺寸的二维斑点.图像如下

  

  对上面这段话的直观理解是:一个图像和一个二维函数进行卷积运算,实际上就是求取图像和这个函数的相似性,同理,图像与高斯拉普拉斯函数进行卷积,就是求取图像和高斯拉普拉斯函数的相似性,当图像中的斑点尺寸与高斯拉普拉斯函数的形

状趋于一致的时候,图像对应位置的拉普拉斯响应达到最大.

  实际上,lapacian算子本身可以检测图像的极值点,设其为L算子,但是因为L算子并不能消除干扰,图像M中的噪声会影响求取到的结果,所以对图像M进行名为G的高斯滤波去除干扰,得到图像M',公式如下M' = M*G*L=M*(G*L);括号里面就是

高斯拉普拉斯算子.

  通过上面的那种算法,我们可以得到斑点,但是没有多尺度的斑点,当高斯协方差o一定的时候,我们只能检测对应o的半径的斑点,具体的半径通过对标准化的高斯拉普拉斯算子进行求导得到,当o=r/根号2时,响应最大,图像黑白反相时,响应最小,因

此将高斯拉普拉斯算子响应达到峰值的o值,成为特征尺度.

  对应二维图像,计算图像在不同尺度下的离散高斯拉普拉斯响应值,然后检查不同尺度位置中的每个值,如果某个尺度下的高斯拉普拉斯响应值,都小于或者大于其他尺度的值,那么该点就是被检测到的图像斑点位置.

  2.基于局部极值的分水岭算法斑点检测simpleBlobDetector

  这种检测方法分为以下几步

  a.对一张图片,设定一个低阈值,设定一个高阈值,在设定一个阈值步进,然后从低阈值到高阈值按照阈值步进取一系列的阈值

  b.用每一个阈值对图像进行二值化,然后使用findcontours查找边,并计算每一个轮廓的中心

  c.对应每一个图片的轮廓的中心,进行抑制,定义一个最小距离,在这个距离区域内的特征中心被定义为一个blob,得到特征点集合

  d.对特征点进行相应的过滤,例如颜色过滤,面积过滤等

  API:Ptr<smpleBlobDetector>create(simpleBlobDetector::params 参数集合)

  参数集合里面包括 minthreshold 低阈值 maxthreshold 高阈值 thresholdStep 阈值步进 minDistanceBetweenBlob  blob分块最小距离 filterColor 颜色过滤 filterArea 面积过滤

          filterByCircularrty 圆度过滤 还有两个是边界长度过滤和凸度过滤,这五种过滤方式任选且只能选一种,默认使用黑色颜色过滤

  具体使用代码如下

  

int main(int argc,char* argv[])
{
Mat srcImage = imread("F:\\opencv\\OpenCVImage\\FeatureDetectSrc1.jpg");
Mat srcGrayImage;
if (srcImage.channels() == )
{
cvtColor(srcImage,srcGrayImage,CV_RGB2GRAY);
}
else
{
srcImage.copyTo(srcGrayImage);
}
vector<KeyPoint>detectKeyPoint;
Mat keyPointImage1,keyPointImage2; SimpleBlobDetector::Params params;
params.minArea = ;
params.maxArea = ;
params.filterByCircularity = true;
Ptr<SimpleBlobDetector> sbd = SimpleBlobDetector::create(params);
sbd->detect(srcGrayImage,detectKeyPoint);
drawKeypoints(srcImage,detectKeyPoint,keyPointImage1,Scalar(,,),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(srcImage,detectKeyPoint,keyPointImage2,Scalar(,,),DrawMatchesFlags::DEFAULT); imshow("src image",srcImage);
imshow("keyPoint image1",keyPointImage1);
imshow("keyPoint image2",keyPointImage2); imwrite("F:\\opencv\\OpenCVImage\\FeatureDetectSrc1SimpleBlobDetectorKeyPointImageDefault.jpg",keyPointImage2); waitKey();
return ;
}

处理图片

可以看到,检测到了摄像头那里的斑块

  

opencv图像特征检测之斑点检测的更多相关文章

  1. OPENCV图像特征点检测与FAST检测算法

    前面描述角点检测的时候说到,角点其实也是一种图像特征点,对于一张图像来说,特征点分为三种形式包括边缘,焦点和斑点,在OPENCV中,加上角点检测,总共提供了以下的图像特征点检测方法 FAST SURF ...

  2. 一文带你学会使用YOLO及Opencv完成图像及视频流目标检测(上)|附源码

    计算机视觉领域中,目标检测一直是工业应用上比较热门且成熟的应用领域,比如人脸识别.行人检测等,国内的旷视科技.商汤科技等公司在该领域占据行业领先地位.相对于图像分类任务而言,目标检测会更加复杂一些,不 ...

  3. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  4. blob斑点检测

    目录 1. 可选算法 1.1. Laplacian of Gaussian (LoG) 1.2. Difference of Gaussian (DoG) 1.3. Determinant of He ...

  5. OpenCV图像处理中“找圆技术”的使用

    一.为什么"找圆"     圆是基本图形的一种,更为重要的是,自然情况下采集的图像,很少大量存在"圆":但凡存在的,大都是人工的,那么就必然代表特定的意义,从而 ...

  6. OpenCV图像金字塔:高斯金字塔、拉普拉斯金字塔与图片尺寸缩放

    这篇已经写得很好,真心给作者点个赞.题目都是直接转过来的,直接去看吧. Reference Link : http://blog.csdn.net/poem_qianmo/article/detail ...

  7. 斑点检测(LoG,DoG)(下)

    斑点检测(LoG,DoG)(下) LoG, DoG, 尺度归一化 上篇文章斑点检测(LoG,DoG)(上)介绍了基于二阶导数过零点的边缘检测方法,现在我们要探讨的是斑点检测.在边缘检测中,寻找的是二阶 ...

  8. 斑点检测(LoG,DoG) [上]

    斑点检测(LoG,DoG) [上] 维基百科,LoG,DoG,DoH 在计算机视觉中,斑点检测是指在数字图像中找出和周围区域特性不同的区域,这些特性包括光照或颜色等.一般图像中斑点区域的像素特性相似甚 ...

  9. OpenCV 学习笔记 05 人脸检测和识别

    本节将介绍 Haar 级联分类器,通过对比分析相邻图像区域来判断给定图像或子图像与已知对象是否匹配. 本章将考虑如何将多个  Haar 级联分类器构成一个层次结构,即一个分类器能识别整体区域(如人脸) ...

随机推荐

  1. sh语法入门学习

    玩linux都知道sh脚本的方便,但如何编写sh脚本却是像我这样的新手和菜鸟的难题.能不能编写得出来是一回事,了不了解又是另一回事.抱着好好学习,天天向上的精神,大家有空就看看吧,没有坏处的.下面来抄 ...

  2. Ubuntu配置eclipse

    1.安装jdk 去官网下载最新版jdk,目前是 jdk-8u45-linux-x64.tar.gz 创建Java的目标路径文件夹,这里我们放在/usr/lib/jvm下面.在终端下操作: sudo m ...

  3. Math类的round方法小解

    在Math类中有三个关于“四舍五入”的静态方法(ceil,floor,round): ① Math.ceil(number) 向上取整,Math.ceil(11.2) 结果:12            ...

  4. web配置文件的<load-on-startup>0</load-on-startup>

    在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet.当值为0或者大于 ...

  5. 实战WEB 服务器(JAVA编写WEB服务器)

    实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报  分类: ...

  6. 视频录制SurfaceView

    package com.bw.videorecorder; import java.io.File;import java.io.IOException; import android.media.M ...

  7. hdu 1728 逃离迷宫 (BFS)

    逃离迷宫 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  8. Win7下用easyBCD引导安装Ubuntu15.04

    1 准备工作 easyBCD中添加一个启动项 修改启动项配置文件 注意两点:C盘设备号,镜像名称 title Install Ubuntu root (hd0,) kernel (hd0,)/vmli ...

  9. 转:透析QTP自动化测试框架SAFFRON

    1.为什么要使用框架? 框架是一组自动化测试的规范.测试脚本的基础代码,以及测试思想.惯例的集合.可用于减少冗余代码.提高代码生产率.提高代码重用性和可维护性.例如QTestWare就是QTP自动化测 ...

  10. 改MAC地址

    Google TMAC v6. Or click here