opencv图像处理学习(六十七)——奇异区域(blob检测)

1.什么叫奇异区域

  奇异区域通常是指与周围领域有着某些特征(颜色和灰度)差别的区域,常见的奇异区域如医学领域X光照片或CT某些特定组织,天空中降落等,奇异区域相对于点区域检查更稳定,在目标分割及检测、图像配准、特征分析等领域得到了广泛应用。

  计算机视觉中我们常常关注目标的特征是颜色和灰度,刻画图像中两个区域的视觉相似性有许多方法,如形状描述子、颜色特征、矩特征等。对于某种场景下的应用,具有独特纹理的对象可以使用一个很好的纹理描述符。对颜色不同的区域中的单个对象做相同的扩展,我们可以使用颜色特征来测量对象的不同部分的相似性。利用色彩空间表达RGB颜色空间直方图不能很好地表示颜色扩散现象,因此利用HSV色调饱和度纯度来计算其相应的直方图信息。
  在计算机视觉中,奇异区域检测主要是通过微分检测或局部极值的分水岭算法实现的。基于图像中的奇异区域的邻域像素值或大或小的特征,我们可以通过计算图像中的局部极值点来实现相应兴趣区域的检测。奇异区域检测一般采用下面两种方法来实现:

(1)基于检测检测器检测

  拉普拉斯算子是检测图像奇异区域常用的方法,二维高斯经过拉普拉斯变换后得到:
▽ G = 1 2 π σ 2 e − x 2 + y 2 2 σ 2 \bigtriangledown G=\frac{1}{2\pi\sigma^2}e^{-\frac{x^2+y^2}{2\sigma^2}} G=2πσ21e2σ2x2+y2
  图像与高斯拉普拉斯函数进行卷积操作实际上求取的是图像与这一函数的相似性,奇异区域表示出现的特征就是图像中呈现比它周围像素灰度值大或小的区域,二维高斯拉普拉斯变换恰好呈现出来的就是这种特征。拉普拉斯检测到图像中的局部极值点,通常需要先对图像进行低通滤波,去除伪点噪声。拉普拉斯响应在尺度 σ = r 2 \sigma=\frac{r}{\sqrt 2} σ=2 r时取得极值,也就是说,满足特征空间和尺度上的极值点就是需要检测的奇异区域。

(2)基于局部极值的分水岭检测

  局部极值的分水岭检测奇异区域是对原图像进行多间隔区域二值化操作。对一个二值化图像提取相应的连通域并计算相应区域的连通中心点,根据中心点拟合归类成同一块group,得到对应的blob特征;最后根据得到的中心点集group估计出blob特征和对应的半径。

  blob分析一般用于图像分割或连通性分析

2.SimpleBlobDetector类

  Opencv中提供了操作类SimpleBlobDetector用于奇异区域检测,下面将详细介绍该类的成员及相关参数使用说明。

 class SimpleBlobDetector:public FeatureDetector
 {
	public:

	struct Params
	{
		Params();
		float thresholdStep;//二值化间隔
		float minThreshold;//二值化起始区间
		float maxThreshold;//二值化终止区间
		size_t minRepeatability;
		float minDistBetweenBlobs;
		bool filterByColor;//颜色特征选择
		uchar blobColor;//亮度区域标志
		bool filterByArea;//限定区域标志
		float minArea,maxArea;
		bool filterByCircularity;
		float minCircularity,maxCircularity;//目标半径
		bool filterByInertia;
		float minInertiaRatio,maxInertiaRatio;凸包限定
		float filterByConvexity;
		float minConvexity,maxConvexity;
	}

	SimpleBlobDetector(const SimpleBlobDetector::Params &parameters = SimpleBlobDetector::Params ())

 protected:
 };

  该类实现对blob区域的检测,提取blobs目标是先将输入图像源转化为二值图像,以thresholdStep为参数间隔利用二值区间阈值区间[minThreshold,maxThreshold]进行多次二值操作,然后提取每个二值化图像的区域连通并计算它们的中心;接着根据minDistBetweenBlobs将上一步骤得到的区域中心归类得到group,最后根据group估计得到每个blob的中心及其半径,并返回相应的关键点位置及尺寸。

3.参考代码

  我们来用blob在RGB和HSV两种通道下,看一下漂亮的羲和小姐姐(图像选的不好,建议找划痕检测或者天空飞行物检测):
在这里插入图片描述

  这里是参考代码:

#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>

void main()
{
	cv::Mat srcImage = cv::imread("1.jpg");
	const cv::Mat dstImage1 = srcImage;
	cv::Mat dstImage2 = srcImage;
	cv::imshow("Input", srcImage);

	std::vector<cv::KeyPoint> keypoints1, keypoints2;
	cv::SimpleBlobDetector::Params params;//定义blob类
	params.filterByArea = true;
	params.minArea = 15;
	params.maxArea = 10000;
	cv::Ptr<cv::SimpleBlobDetector> blobDetector = cv::SimpleBlobDetector::create(params);
	
	blobDetector->detect(dstImage1, keypoints1);//RGB通道下奇异区域检测
	cv::drawKeypoints(dstImage1, keypoints1, dstImage1);
	cv::imshow("Output1", dstImage1);
	cv::imwrite("11.png", dstImage1);

	cv::cvtColor(dstImage2, dstImage2, CV_BGR2HSV);
	blobDetector->detect(dstImage2, keypoints2);//HSV通道下奇异区域检测
	cv::drawKeypoints(dstImage2, keypoints2, dstImage2);
	cv::imshow("Output2", dstImage2);
	cv::imwrite("12.png", dstImage2);

	cv::waitKey(0);
}

  得到两个通道的检测图像分别如下:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用OpenCV库可以很容易地实现车牌图像的阈值化操作,获得二值化图。 以下是基本的代码实现: ```python import cv2 # 读取车牌图像 img = cv2.imread('plate.jpg') # 转换为灰度图像 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 自适应二值化处理 thresh_img = cv2.adaptiveThreshold(gray_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 显示二值化图像 cv2.imshow("Thresholded Image", thresh_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在上述代码中,使用了OpenCV自适应阈值处理函数 `cv2.adaptiveThreshold()`,该函数会根据图像的局部像素特征来自动调整二值化阈值,从而得到更好的二值化效果。其中,`gray_img` 是原始车牌图像的灰度图像,`thresh_img` 是通过自适应阈值处理得到的二值化图像。 在调用 `cv2.adaptiveThreshold()` 函数时,需要指定以下几个参数: - `gray_img`:输入的灰度图像。 - `255`:输出的二值化图像像素值的最大值。 - `cv2.ADAPTIVE_THRESH_GAUSSIAN_C`:自适应阈值处理方法,这里采用的是高斯加权平均法。 - `cv2.THRESH_BINARY`:二值化类型,这里采用的是简单的二值化。 - `11`:像素邻域大小,表示当前像素的阈值会根据周围 11×11 个像素的灰度值自适应地调整。 - `2`:常数 C,表示在计算当前像素阈值时需要加上的常数。 最终得到的二值化图像可以通过 `cv2.imshow()` 函数进行显示,其中 `"Thresholded Image"` 是窗口的名称,可以根据需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值