斑点检测
FROM:?http://www.cnblogs.com/ronny/p/3895883.html
1. 什么是斑點(diǎn)
斑點(diǎn)通常是指與周?chē)兄伾突叶炔顒e的區(qū)域。在實(shí)際地圖中,往往存在著大量這樣的斑點(diǎn),如一顆樹(shù)是一個(gè)斑點(diǎn),一塊草地是一個(gè)斑點(diǎn),一棟房子也可以是一個(gè)斑點(diǎn)。由于斑點(diǎn)代表的是一個(gè)區(qū)域,相比單純的角點(diǎn),它的穩(wěn)定性要好,抗噪聲能力要強(qiáng),所以它在圖像配準(zhǔn)上扮演了很重要的角色。
同時(shí)有時(shí)圖像中的斑點(diǎn)也是我們關(guān)心的區(qū)域,比如在醫(yī)學(xué)與生物領(lǐng)域,我們需要從一些X光照片或細(xì)胞顯微照片中提取一些具有特殊意義的斑點(diǎn)的位置或數(shù)量。
比如下圖中天空的飛機(jī)、向日葵的花盤(pán)、X線斷層圖像中的兩個(gè)斑點(diǎn)。
?????
在視覺(jué)領(lǐng)域,斑點(diǎn)檢測(cè)的主要思路都是檢測(cè)出圖像中比它周?chē)袼鼗叶戎荡蠡虮戎車(chē)叶戎敌〉膮^(qū)域。一般有兩種方法來(lái)實(shí)現(xiàn)這一目標(biāo):
這里我們重點(diǎn)介紹第一種方法,主要檢測(cè)LOG斑點(diǎn)。而OpenCV中SimpleBlobDetector斑點(diǎn)檢測(cè)算子就實(shí)現(xiàn)了第二種方法,我們這里也會(huì)介紹它的接口使用方法。
2. LOG斑點(diǎn)檢測(cè)
2.1 基本原理
利用高斯拉普通拉斯(Laplace of Gaussian,LOG)算子檢測(cè)圖像斑點(diǎn)是一種十分常用的方法,對(duì)于二維高斯函數(shù):
G(x,y;σ)=12πσ2exp(?x2+y22σ2)
它的拉普拉斯變換為:
?2g=?2g?x2+?2g?y2
規(guī)范化的高斯拉普變換為:
?2norm=σ2?2g=σ2(?2g?x2+?2g?y2)=?12πσ2[1?x2+y2σ2]?exp(?x2+y22σ2)
規(guī)范化算法子在二維圖像上顯示是一個(gè)圓對(duì)稱(chēng)函數(shù),如下圖所示。我們可以用這個(gè)算子來(lái)檢測(cè)圖像中的斑點(diǎn),并且可以通過(guò)改變σ的值,可以檢測(cè)不同尺寸的二維斑點(diǎn)。
???
2.2 LOG原理解釋
其實(shí)從更直觀的角度去解釋為什么LOG算子可以檢測(cè)圖像中的斑點(diǎn)是:
圖像與某一個(gè)二維函數(shù)進(jìn)行卷積運(yùn)算實(shí)際就是求取圖像與這一函數(shù)的相似性。同理,圖像與高斯拉普拉斯函數(shù)的卷積實(shí)際就是求取圖像與高斯拉普拉斯函數(shù)的相似性。當(dāng)圖像中的斑點(diǎn)尺寸與高斯拉普拉斯函數(shù)的形狀趨近一致時(shí),圖像的拉普拉斯響應(yīng)達(dá)到最大。
從概率的角度解釋為:假設(shè)原圖像是一個(gè)與位置有關(guān)的隨機(jī)變量X的密度函數(shù),而LOG為隨機(jī)變量Y的密度函數(shù),則隨機(jī)變量X+Y的密度分布函數(shù)即為兩個(gè)函數(shù)的卷積形式(這一部分的理論,可以參見(jiàn)本博客概率與統(tǒng)計(jì)相關(guān)文章)。如果想讓X+Y能取到最大值,則X與Y能保持步調(diào)一致最好,即X上升時(shí),Y也上升,X最大時(shí),Y也最大。
那么LOG算子是怎么被構(gòu)想出來(lái)的呢?
事實(shí)上我們知道Laplace可以用來(lái)檢測(cè)圖像中的局部極值點(diǎn),但是對(duì)噪聲敏感,所以在我們對(duì)圖像進(jìn)行Laplace卷積之前,我們用一個(gè)高斯低通濾波對(duì)圖像進(jìn)行卷積,目標(biāo)是去除圖像中的噪聲點(diǎn)。這一過(guò)程 可以描述為:
先對(duì)圖像f(x,y)用方差為σ的高斯核進(jìn)行高斯濾波,去除圖像中的噪點(diǎn)。
L(x,y;σ)=f(x,y)?G(x,y;σ)
然后對(duì)圖像的拉普拉斯圖像則為:
?2=?2L?x2+?2L?y2
而實(shí)際上有下面等式:
?2[G(x,y)?f(x,y)]=?2[G(x,y)]?f(x,y)
所以,我們可以先求高斯核的拉普拉斯算子,再對(duì)圖像進(jìn)行卷積。也就是一開(kāi)始描述的步驟。
2.3 LOG算子的實(shí)現(xiàn)
Mat Feat::getHOGKernel(Size& ksize, double sigma) {Mat kernel(ksize, CV_64F);Point centPoint = Point((ksize.width -1)/2, ((ksize.height -1)/2));// first calculate Gaussianfor (int i=0; i < kernel.rows; i++){double* pData = kernel.ptr<double>(i);for (int j = 0; j < kernel.cols; j++){double param = -((i - centPoint.y) * (i - centPoint.y) + (j - centPoint.x) * (j - centPoint.x)) / (2*sigma*sigma);pData[j] = exp(param);}}double maxValue;minMaxLoc(kernel, NULL, &maxValue);for (int i=0; i < kernel.rows; i++){double* pData = kernel.ptr<double>(i);for (int j = 0; j < kernel.cols; j++){if (pData[j] < EPS* maxValue){pData[j] = 0;}}}double sumKernel = sum(kernel)[0];if (sumKernel != 0){kernel = kernel / sumKernel;}// now calculate Laplacianfor (int i=0; i < kernel.rows; i++){double* pData = kernel.ptr<double>(i);for (int j = 0; j < kernel.cols; j++){double addition = ((i - centPoint.y) * (i - centPoint.y) + (j - centPoint.x) * (j - centPoint.x) - 2*sigma*sigma)/(sigma*sigma*sigma*sigma);pData[j] *= addition;}}// make the filter sum to zerosumKernel = sum(kernel)[0];kernel -= (sumKernel/(ksize.width * ksize.height)); return kernel; }2.4 多尺度檢測(cè)
我們注意到當(dāng)σ尺度一定時(shí),只能檢測(cè)對(duì)應(yīng)半徑的斑點(diǎn),那么檢測(cè)的是多大半徑的斑點(diǎn)呢,我們可以通過(guò)對(duì)規(guī)范化的二維拉普拉斯高斯算子求導(dǎo):
規(guī)范化的高斯拉普拉斯函數(shù)為:
?2norm=?12πσ2[1?x2+y2σ2]?exp(?x2+y22σ2)
求?2norm的極點(diǎn)值等價(jià)于求取下式:
?(?2norm)?σ=0
得到:
(x2+y2?2σ2)?exp(?(x2+y2)2σ2)
r2?2σ2=0
對(duì)于圖像中的斑點(diǎn),在尺度σ=r/2√時(shí),高斯拉普拉斯響應(yīng)值達(dá)到最大。同理,如果圖像中的圓形斑點(diǎn)黑白反向,那么,它的高斯拉普拉斯響應(yīng)值在σ=r/2√時(shí)達(dá)到最小。將高斯拉普拉斯響應(yīng)達(dá)到峰值時(shí)的尺度σ值,稱(chēng)為特征尺度。
那么在多尺度的情況下,同時(shí)在空間和尺度上達(dá)到最大值(或最小值)的點(diǎn)就是我們所期望的斑點(diǎn)。對(duì)于二維圖像I(x,y),計(jì)算圖像在不同尺度下的離散拉普拉斯響應(yīng)值,然后檢查位置空間中的每個(gè)點(diǎn);如果該點(diǎn)的拉普拉斯響應(yīng)值都大小于或小于其他26個(gè)立方空間領(lǐng)域(9+8+9)的值,那么該點(diǎn)就是被檢測(cè)到的圖像斑點(diǎn)。
3 OpenCV進(jìn)行斑點(diǎn)檢測(cè)
opencv中檢測(cè)Blobs的類(lèi)為SimpleBlobDetector,這個(gè)類(lèi)在opencv中的定義如下:
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;bool filterByConvexity;float minConvexity, maxConvexity; };SimpleBlobDetector(const SimpleBlobDetector::Params ¶meters = SimpleBlobDetector::Params());protected:... };算法的大致步驟如下:
同時(shí)該支持提取特征的方法,一共有5個(gè)選項(xiàng),這里就不多加描述了,默認(rèn)是提取黑色圓形的Blob特征。下面是一個(gè)示例
int main(int argc, char** argv)?
{?
??? Mat image = imread(argv[1]);?
??? vector<KeyPoint> keyPoints;?
??? SimpleBlobDetector::Params params;
??? SimpleBlobDetector blobDetect(params);?
??? blobDetect.create("SimpleBlob");?
??? blobDetect.detect(image, keyPoints);?
??? cout << keyPoints.size() << endl;?
??? drawKeypoints(image, keyPoints, image, Scalar(255,0,0));
??? namedWindow("blobs");?
??? imshow("blobs", image);?
??? waitKey();?
??? return 0;?
}
??
總體來(lái)說(shuō),OpenCV的斑點(diǎn)檢測(cè)效果還算不錯(cuò),但是在有些圖像的效果上明顯不如LOG算子檢測(cè)的檢測(cè)效果。
4. 擴(kuò)展閱讀
一個(gè)與LOG濾波核近似的是高斯差分DOG濾波核,它的定義為:
D(x,y,σ)=(G(x,y,kσ)–G(x,y,σ))?I(x,y)=L(x,y,kσ)?L(x,y,σ)
其中k為兩個(gè)相鄰尺度間的比例因子。
DOG可以看作為L(zhǎng)OG的一個(gè)近似,但是它比LOG的效率更高。
前面介紹的微分算子在近圓的斑點(diǎn)檢測(cè)方面效果很好,但是這些檢測(cè)算子被限定于只能檢測(cè)圓形斑點(diǎn),而且不能估計(jì)斑點(diǎn)的方向,因?yàn)長(zhǎng)OG算子等都是中心對(duì)稱(chēng)的。如果我們定義一種二維高斯核的變形,記它在X方向與Y方向上具有不同的方差,則這種算子可以用來(lái)檢測(cè)帶有方向的斑點(diǎn)。
G(x,y)=A?exp(?[(ax2+2bxy+cy2)])
a=cos2θ2σ2x+sin2θ2σ2y,b=?sin2θ2σ2x+sin2θ4σ2y,c=sin2θ2σ2x+cos2θ2σ2y
其中A是規(guī)一性因子。
5. 參考資料
1. 《現(xiàn)代數(shù)字圖像 -- 處理技術(shù)提高與應(yīng)用案例詳解》
2. 《圖像局部不變性特征與描述》
3.? Lindeberg, T. Feature Detection with Automatic Scale Selection
4. Hui Kong. A Generalized Laplacian Of Gaussian Filter for Blob Detection and Its Applications.
5.?OpenCV2馬拉松第20圈——blob特征檢測(cè)原理與實(shí)現(xiàn)
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
- 上一篇: 图像的矩特征
- 下一篇: SIFT定位算法关键步骤的说明