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

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

  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 ;
}

处理图片

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

  

最新文章

  1. mac osx install mysql
  2. Linux系统的初化始配置(包括配置网络,修改主机名,关闭firewalld与selinux的生效)
  3. win7安装nodejs
  4. 第七天 面向对象进阶与socket编程
  5. 带AI的俄罗斯方块源码
  6. electron开发(一)
  7. Jenkins遇到问题三:调整jdk版本不生效的解决办法
  8. python27+django1.9创建app的视图及实现动态页面
  9. xmlBean学习二
  10. chosen 下拉框
  11. java 判断是不是检查性异常
  12. ucos任务控制块详解
  13. JAVA 探究NIO
  14. windows安全更新程序(KB4093112) 安装失败 错误0x80070011
  15. 谷歌SEO初学者常见问题解答
  16. 记录Redis使用中遇到的两个问题(原子性及数据完整性)
  17. SSL证书问题汇总
  18. Linux服务器---邮件服务postfix安装
  19. 报错:无法截断表 '某表',因为该表正由 FOREIGN KEY 约束引用
  20. C++ STL Maps

热门文章

  1. http請求瀏覽器的緩存機制
  2. 第四届河南省省赛 走迷宫 二分+DFS
  3. tab奇偶行颜色交替+插件
  4. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)
  5. 使用U盘在Mac机上装win8.1系统
  6. CodeForces 546 D. Soldier and Number Game(素数有关)
  7. J2SE基本数据结构
  8. 转:设置Loadrunner负载机临时文件目录
  9. 关于python的可变和不可变对象
  10. 使用Log4net记录日志