索引地址:系列索引
BLOB
Blob是图像中共享某些共同属性(例如灰度值)的一组连接的像素。在上图中,暗连通区域是Blob,Blob检测的目的就是识别和标记这些区域。
blob分析一般用于图像分割或连通性分析,OpenCV提供了一种方便的方法来检测Blob,并根据不同的属性对其进行过滤。
测试代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| #include<opencv2/opencv.hpp> #include <iostream>
using namespace std; using namespace cv; int main() { Mat src=imread("circles.jpg"); SimpleBlobDetector::Params pDefaultBLOB; pDefaultBLOB.thresholdStep = 10; pDefaultBLOB.minThreshold = 50; pDefaultBLOB.maxThreshold = 220; pDefaultBLOB.minRepeatability = 2; pDefaultBLOB.minDistBetweenBlobs = 10; pDefaultBLOB.filterByColor = true; pDefaultBLOB.blobColor = 0; pDefaultBLOB.filterByArea = true; pDefaultBLOB.minArea = 25; pDefaultBLOB.maxArea = 5000; pDefaultBLOB.filterByCircularity = false; pDefaultBLOB.minCircularity = 0.8f; pDefaultBLOB.maxCircularity = (float)3.40282e+038; pDefaultBLOB.filterByInertia = true; pDefaultBLOB.minInertiaRatio = 0.1f; pDefaultBLOB.maxInertiaRatio = (float)3.40282e+038; pDefaultBLOB.filterByConvexity = true; pDefaultBLOB.minConvexity = 0.95f; pDefaultBLOB.maxConvexity = (float)3.40282e+038; Ptr<SimpleBlobDetector> blob=SimpleBlobDetector::create(pDefaultBLOB); vector<KeyPoint> key_points; blob->detect(src,key_points); Mat outImg; drawKeypoints(src,key_points,outImg,Scalar(0,0,255)); imshow("blob",outImg);
waitKey(); return 0; }
|
效果为
奇异区域检测
奇异区域通常是指与周围领域有着某些特征(颜色和灰度)差别的区域,常见的奇异区域如医学领域X光照片或CT某些特定组织,天空中降落等,奇异区域相对于点区域检查更稳定,在目标分割及检测、图像配准、特征分析等领域得到了广泛应用。
计算机视觉中我们常常关注目标的特征是颜色和灰度,刻画图像中两个区域的视觉相似性有许多方法,如形状描述子、颜色特征、矩特征等。对于某种场景下的应用,具有独特纹理的对象可以使用一个很好的纹理描述符。对颜色不同的区域中的单个对象做相同的扩展,我们可以使用颜色特征来测量对象的不同部分的相似性。利用色彩空间表达RGB颜色空间直方图不能很好地表示颜色扩散现象,因此利用HSV色调饱和度纯度来计算其相应的直方图信息。
在计算机视觉中,奇异区域检测主要是通过微分检测或局部极值的分水岭算法实现的。基于图像中的奇异区域的邻域像素值或大或小的特征,我们可以通过计算图像中的局部极值点来实现相应兴趣区域的检测。奇异区域检测一般采用下面两种方法来实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
#include "opencv2/opencv.hpp" #include <iostream> using namespace cv; int main() { cv::Mat srcImage = cv::imread("..\\images\\flow.jpg"); if (!srcImage.data) return -1; cv::imshow("srcImage", srcImage); std::vector<KeyPoint> keypoints; SimpleBlobDetector::Params params; params.filterByArea = true; params.minArea = 10; params.maxArea = 100; Ptr<SimpleBlobDetector> blobDetector = SimpleBlobDetector::create(params); blobDetector->detect(srcImage, keypoints); drawKeypoints(srcImage, keypoints, srcImage, Scalar(255, 0, 0)); cv::imshow("result", srcImage); cv::waitKey(); return 0; }
|
效果