blob斑点检测
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 代码实现
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
SimpleBlobDetector,是非常简单的模块,算法使用如下参数控制,且执行之后的流程:
Thresholding, 阈值处理
通过使用从minThreshold开始的阈值对源图像进行阈值处理,将源图像转换成多个二进制图像。这些阈值以thresholdStep大小依次递增直到maxThreshold,所以第一个阈值是minThreshold,第二个是minThreshold+thresholdStep,依此类推。
Grouping, 分组
在每个二进制图像中,连接白色像素被分成一组,我们称为二进制斑点(binary blobs)
Merging, 合并
计算二进制图像中二进制斑点的重心,并合并距离小于minDistBetweenBlobs的斑点
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的参数来过滤我们想要的斑点类型:
按颜色
首先你需要设置filterByColor=1,设置blobColor=0选择颜色更暗的斑点,blobColor=255选择颜色更浅的斑点
注意:此功能已经损坏,我检查了代码,它似乎有一个逻辑错误。
按大小
可以通过设置参数filterByArea=1以及minArea和maxArea的适当值来根据大小过滤斑点,例如,设置minArea=100将过滤掉所有小于100像素的斑点
按形状:现在形状有三种不同的参数
Circularity, 圆度
这只是测量斑点的圆形接近程度,例如正六边形具有比正方形更高的圆度,要按照圆度过滤,请设置
filterByCircularity=1
然后为minCircularity和maxCircularity
设置适当的值。Convexity, 凸度
设置
filterByConvexity=1
,然后设置0<= minConvexity<=1
和maxConvexity<=1
。Ratio, 惯性比(长度)
设定
filterByInertia=1
,并设置0 ≤ minInertiaRatio <= 1
和maxInertiaRatio<=1
。
blob斑点检测的更多相关文章
- 斑点检测(LoG,DoG)(下)
斑点检测(LoG,DoG)(下) LoG, DoG, 尺度归一化 上篇文章斑点检测(LoG,DoG)(上)介绍了基于二阶导数过零点的边缘检测方法,现在我们要探讨的是斑点检测.在边缘检测中,寻找的是二阶 ...
- 斑点检测(LoG,DoG) [上]
斑点检测(LoG,DoG) [上] 维基百科,LoG,DoG,DoH 在计算机视觉中,斑点检测是指在数字图像中找出和周围区域特性不同的区域,这些特性包括光照或颜色等.一般图像中斑点区域的像素特性相似甚 ...
- opencv图像特征检测之斑点检测
前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力. ...
- TB3_Autorace之交通杆检测
利用blob检测算法识别交通杆,控制TB3机器人完成对交通杆的起停动作! 上一篇博文中<TB3_Autorace之路标检测>订阅了原始图像信息,经过SIFT检测识别出道路交通标志,这里我们 ...
- Blob检测
一 Laplace 算子 使用一阶微分算子可以检测图像边缘.对于剧烈变化的图像边缘,一阶微分效果比较理想.但对于缓慢变化的图像边缘,通过对二阶微分并寻找过零点可以很精确的定位边缘中心.二阶微分即为 L ...
- FAST特征点检测
Features From Accelerated Segment Test 1. FAST算法原理 博客中已经介绍了很多图像特征检测算子,我们可以用LoG或者DoG检测图像中的Blobs(斑点检测) ...
- DOG角点检测——opencv实现
1.原理 Difference of Gaussian(DOG)是高斯函数的差分.将两幅图像在不同参数下的高斯滤波结果相减,得到DoG图.步骤: 处理一幅图像在不同高斯参数下的DoG 用两个不同的5x ...
- 第十一节、Harris角点检测原理(附源码)
OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...
- SIFT特征提取分析
SIFT特征提取分析 sift 关键点,关键点检测 读'D. G. Lowe. Distinctive Image Features from Scale-Invariant Keypoints[J] ...
随机推荐
- DPDK LPM库(学习笔记)
1 LPM库 DPDK LPM库组件为32位的key实现了最长前缀匹配(LPM)表查找方法,该方法通常用于在IP转发应用程序中找到最佳路由匹配. 2 LPM API概述 LPM组件实例的主要配置参数是 ...
- InnoDB存储引擎的高级特性大盘点
InnoDB作为mysql数据库最常用的存储引擎,自然包含了其独有的很多特性.如相比于memory.MyISAM引擎,InnoDB支持行级锁.事务等都是比较重要的特性. 本文将盘点下InnoDB处理事 ...
- POJ2991
题目链接:https://vjudge.net/problem/POJ-2991 知识准备: 1.向量旋转公式:向量(x,y)逆时针旋转角度A,则旋转后的向量为(x*cos A-y*sin A, x* ...
- Lightoj1356
题目链接:https://vjudge.net/problem/LightOJ-1356 题目大意: T个 test case,每个 test case 给出一个 N 个数的集合.请找出一个最大的子集 ...
- 使用EditPlus根据指定字符批量换行,快速填充Postman请求参数键值对
1.当某个.ext格式的文件中的重复格式内容太多时,而又想要根据某个字符进行批量换行时,那么可以使用EditPlus进行批量换行. 在开发过程中就会经常遇到这种问题,比如把Url的请求参数,快速的填写 ...
- 循序渐进VUE+Element 前端应用开发(2)--- Vuex中的API、Store和View的使用
在我们开发Vue应用的时候,很多时候需要记录一些变量的内容,这些可以用来做界面状态的承载,也可以作为页面间交换数据的处理,处理这些内容可以归为Vuex的状态控制.例如我们往往前端需要访问后端数据,一般 ...
- linux 权限笔记
权限模型 linux权限模型,指的是对文件.文件夹同的读写权限,同用户之间的权限管理模型 三种角色 user 文件.文件夹的创建者,所有人 group 一个group对应多个user,user自动具有 ...
- 【转】roc曲线与auc值
https://www.cnblogs.com/gatherstars/p/6084696.html ROC的全名叫做Receiver Operating Characteristic,其主要分析工具 ...
- Alink漫谈(五) : 迭代计算和Superstep
Alink漫谈(五) : 迭代计算和Superstep 目录 Alink漫谈(五) : 迭代计算和Superstep 0x00 摘要 0x01 缘由 0x02 背景概念 2.1 四层执行图 2.2 T ...
- day 6 (笔记由图转)
.