blob 或者叫斑点,就是在一幅图像上,暗背景上的亮区域,或者亮背景上的暗区域。由于斑点代表的是一个区域,相比单纯的角点,它的稳定性要好,抗噪声能力要强,所以它在图像配准上扮演了很重要的角色。

同时有时图像中的斑点也是我们关心的区域,比如在医学与生物领域,我们需要从一些X光照片或细胞显微照片中提取一些具有特殊意义的斑点的位置或数量。

比如天空的飞机、向日葵的花盘、X线断层图像中的两个斑点。

1. 可选算法

1.1. Laplacian of Gaussian (LoG)

这是速度最慢,可是最准确的一种算法。简单来说,就是对一幅图先进行一系列不同尺度的高斯滤波,然后对滤波后的图像做Laplacian运算。将全部的图像进行叠加。局部最大值就是所要检測的blob,这个算法对于大的blob检測会非常慢,还有就是该算法适合于检測暗背景下的亮blob。

1.2. Difference of Gaussian (DoG)

这是LoG算法的一种高速近似,对图像进行高斯滤波之后,不做Laplacian运算,直接做减法。相减后的图做叠加。找到局部最大值,这个算法的缺陷与LoG相似。

如果需要利用 LoG 或 DoG 检測亮背景上的暗blob,能够将图像做反相,这样亮背景就变成了暗背景,而暗blob就变成了亮blob,然后就能够用这两个算法了,检測完之后再反回来就好了。

1.3. Determinant of Hessian (DoH)

这是最快的一种算法,不须要做多尺度的高斯滤波,运算速度自然提升非常多,这个算法对暗背景上的亮blob或者亮背景上的暗blob都能检測。

缺点是小尺寸的blob检測不准确。

2. skimage 代码实现

homepage

from matplotlib import pyplot as plt
from skimage import data
from skimage.feature import blob_dog, blob_log, blob_doh
from math import sqrt
from skimage.color import rgb2gray image = data.hubble_deep_field()[0:500, 0:500]
image_gray = rgb2gray(image) plt.imshow(image) blobs_log = blob_log(image_gray, max_sigma=30, num_sigma=10, threshold=.1)
# Compute radii in the 3rd column.
blobs_log[:, 2] = blobs_log[:, 2] * sqrt(2) blobs_dog = blob_dog(image_gray, max_sigma=30, threshold=.1)
blobs_dog[:, 2] = blobs_dog[:, 2] * sqrt(2) blobs_doh = blob_doh(image_gray, max_sigma=30, threshold=.01) blobs_list = [blobs_log, blobs_dog, blobs_doh]
colors = ['yellow', 'lime', 'red']
titles = ['Laplacian of Gaussian', 'Difference of Gaussian',
'Determinant of Hessian']
sequence = zip(blobs_list, colors, titles) fig,axes = plt.subplots(1, 3, sharex=True, sharey=True, subplot_kw={'adjustable':'box-forced'})
axes = axes.ravel()
for blobs, color, title in sequence:
ax = axes[0]
axes = axes[1:]
ax.set_title(title)
ax.imshow(image, interpolation='nearest')
for blob in blobs:
y, x, r = blob
c = plt.Circle((x, y), r, color=color, linewidth=2, fill=False)
ax.add_patch(c) plt.show()

效果图:

3. 基于 OpenCV

homepage

SimpleBlobDetector,是非常简单的模块,算法使用如下参数控制,且执行之后的流程:

  1. Thresholding, 阈值处理

    通过使用从minThreshold开始的阈值对源图像进行阈值处理,将源图像转换成多个二进制图像。这些阈值以thresholdStep大小依次递增直到maxThreshold,所以第一个阈值是minThreshold,第二个是minThreshold+thresholdStep,依此类推。

  2. Grouping, 分组

    在每个二进制图像中,连接白色像素被分成一组,我们称为二进制斑点(binary blobs)

  3. Merging, 合并

    计算二进制图像中二进制斑点的重心,并合并距离小于minDistBetweenBlobs的斑点

  4. Center & Radius Calculation, 中心和半径计算

    计算并返回新合并的blobs的中心和半径。

import cv2
import numpy as np
#读图片
im = cv2.imread('blod.jpg', cv2.IMREAD_GRAYSCALE)
#创建一个检测器并使用默认参数
detector = cv2.SimpleBlobDetector()
#检测斑点
keypoints = detector.detect(im)
#将检测到的斑点圈上红色的圆圈
#DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS保证圆的大小和斑点大小一样
im_with_keypoints = cv2.drawKeypoints(im, keypoints, np.array([]), (0,0,255),
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
#显示检测到的点
cv2.imshow('keypoints', im_with_keypoints)
cv2.waitKey(0)

3.1. 过滤斑点

可以设置SimpleBlobDetector的参数来过滤我们想要的斑点类型:

  1. 按颜色

    首先你需要设置filterByColor=1,设置blobColor=0选择颜色更暗的斑点,blobColor=255选择颜色更浅的斑点

    注意:此功能已经损坏,我检查了代码,它似乎有一个逻辑错误。

  2. 按大小

    可以通过设置参数filterByArea=1以及minArea和maxArea的适当值来根据大小过滤斑点,例如,设置minArea=100将过滤掉所有小于100像素的斑点

  3. 按形状:现在形状有三种不同的参数

    • Circularity, 圆度

      这只是测量斑点的圆形接近程度,例如正六边形具有比正方形更高的圆度,要按照圆度过滤,请设置 filterByCircularity=1 然后为 minCircularity和maxCircularity 设置适当的值。

    • Convexity, 凸度

      设置 filterByConvexity=1 ,然后设置 0<= minConvexity<=1maxConvexity<=1

    • Ratio, 惯性比(长度)

      设定 filterByInertia=1 ,并设置 0 ≤ minInertiaRatio <= 1maxInertiaRatio<=1

blob斑点检测的更多相关文章

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

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

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

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

  3. opencv图像特征检测之斑点检测

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

  4. TB3_Autorace之交通杆检测

    利用blob检测算法识别交通杆,控制TB3机器人完成对交通杆的起停动作! 上一篇博文中<TB3_Autorace之路标检测>订阅了原始图像信息,经过SIFT检测识别出道路交通标志,这里我们 ...

  5. Blob检测

    一 Laplace 算子 使用一阶微分算子可以检测图像边缘.对于剧烈变化的图像边缘,一阶微分效果比较理想.但对于缓慢变化的图像边缘,通过对二阶微分并寻找过零点可以很精确的定位边缘中心.二阶微分即为 L ...

  6. FAST特征点检测

    Features From Accelerated Segment Test 1. FAST算法原理 博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测) ...

  7. DOG角点检测——opencv实现

    1.原理 Difference of Gaussian(DOG)是高斯函数的差分.将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图.步骤: 处理一幅图像在不同高斯参数下的DoG 用两个不同的5x ...

  8. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

  9. SIFT特征提取分析

    SIFT特征提取分析 sift 关键点,关键点检测 读'D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J] ...

随机推荐

  1. [A*算法]基于Unity实现A*算法(二)

    写在前面:上一篇当时是非常简单的了解一下A*,昨天还有一些问题没解决,就暂时把自己查阅的文坛摘抄了过来(毕竟人家写的比我要好的多 :> ) 今天终于解决了,就又写了这一篇,正好我自己再梳理一遍, ...

  2. 苏浪浪 201771010120《面向对象程序设计(java)》第六章学习总结

    第五章 主要学习OOP另一个部分----继承,继承使程序员可以使用现有的类,并根据需要进行修改.这是Java程序设计中的一个基础设计. 1.类.超类和子类: (1) 已有类称为:超类(supercla ...

  3. 【转】团队项目的Git分支管理规范

    原文地址: http://blog.jboost.cn/git-branch.html 分支管理 创建项目时(一般是服务型项目,工具型或辅助型项目可以简单一些),会针对不同环境创建三个常设分支: de ...

  4. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  5. 引入mybatis-plus报 Invalid bound statement错误怎么办,动动手指改一个地方就行

    错误 Mybatis-Plus (简称MP) 是mybatis的一个增强工具,在mybatis的基础上只做增强不做改变,简化了开发效率.其实就是帮我们封装了一些简单的curd方法,可以直接调用,不必再 ...

  6. pandas手册

    https://www.dataquest.io/blog/large_files/pandas-cheat-sheet.pdf

  7. 北京理工大学复试上机--2001A

    1.编写程序,计算下列分段函数 y=f(x)的值. y = -x + 2.5, 0 <= x < 2 y = 2 - 1.5 (x - 3) (x - 3), 2 <= x < ...

  8. win10下安装scrapy出现错误的处理

    一.背景: 在win10的dos窗口下使用命令pip install scrapy安装scrapy时,出现“ error: Microsoft Visual C++ 14.0 is required. ...

  9. Rocket - debug - Example: Write Memory

    https://mp.weixin.qq.com/s/on1LugO9fTFJstMes3T2Xg 介绍riscv-debug的使用实例:使用三种方法写内存. 1. Using System Bus ...

  10. 【大厂面试02期】Redis过期key是怎么样清理的?

    PS:本文已收录到1.1K Star数开源学习指南--<大厂面试指北>,如果想要了解更多大厂面试相关的内容,了解更多可以看 http://notfound9.github.io/inter ...