簡介
? OpenCV是一個基于BSD許可開源發(fā)行的跨平臺計算機視覺庫魔种。擁有C++惊奇,Python和Java接口,并且支持Windows, Linux, Mac OS, iOS 和 Android系統(tǒng)跟啤。實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。
模塊 | 功能 |
---|---|
Core | 核心基礎模塊熬甫,定義了被所有其他模塊和基本數(shù)據(jù)結構(包括重要的多維數(shù)組Mat)使用的基本函數(shù)、底層數(shù)據(jù)結構和算法函數(shù) |
Imgproc | 圖像處理模塊蔓罚,包括:濾波椿肩、高斯模糊、形態(tài)學處理豺谈、幾何變換郑象、顏色空間轉換及直方圖計算等 |
Highgui | 高層用戶交互模塊,包括:GUI茬末、圖像與視頻I\O等 |
Video | 視頻分析,厂榛,運動分析及目標跟蹤。 |
Calib3d | 3D模塊丽惭,包括:攝像機標定击奶、立體匹配、3D重建等 |
Features2d | 二維特征檢測與描述模塊责掏,包括:圖像特征檢測柜砾、描述、匹配等 |
Objdetect | 目標檢測模塊换衬,如:人臉檢測等 |
MI | 機器學習模塊痰驱,包括:支持向量機证芭、神經網(wǎng)絡等 |
Flann | 最近鄰開源庫。包含一系列查找算法担映,自動選取最快算法的機制废士。 |
Imgcodecs | 圖像編解碼模塊,圖像文件的讀寫操作 |
Photo | 圖像計算(處理)模塊蝇完,圖像修復及去噪湃密。 |
Shape | 形狀匹配算法模塊。描述形狀四敞、比較形狀 |
Stitching | 圖像拼接 |
Superres | 超分辨率模塊 |
Videoio | 視頻讀寫模塊泛源,視頻文件包括攝像頭的輸入。 |
Videostab | 解決拍攝的視頻穩(wěn)定 |
Dnn | 深度神經網(wǎng)絡 |
contrib | 可以引入額外模塊 |
LBP
LBP(Local Binary Pattern忿危,局部二值模式)是一種用來描述圖像局部紋理特征的算子,具有多分辨率达箍、灰度尺度不變、旋轉不變等特性铺厨。主要用于特征提取中的紋理提取缎玫。
LBP的核心思想就是:以中心像素的灰度值作為閾值,與他的領域相比較得到相對應的二進制碼來表示局部紋理特征解滓。
基本LBP
原始的LBP算子定義為在3*3的窗口內赃磨,處理83這個像素點的lbp值:
? 將83與包圍83的8個位置進行比較。如果大于83則取值為1洼裤,否則為0,然后將這些數(shù)據(jù)順時針組合在一起邻辉,這樣的到一個01111100,即:0x7C(124)。這就是83位置的lbp值腮鞍。順序并無硬性要求值骇,只要在同一處理中保持相同的順序即可。提取的LBP算子在每個像素點都可以得到一個LBP值移国,對一幅圖像提取其原始的LBP算子之后吱瘩,得到的原始LBP特征依然是“一幅圖片”(記錄的是每個像素點的LBP值)這種圖片稱之為lbp圖譜。
/**
* 原始lbp:應該是3x3的src(先不管3x3)
* src: 原圖
* dst: 計算出的lbp圖譜
*
*/
void processLBP(Mat src, Mat &dst){
// 循環(huán)處理圖像數(shù)據(jù)
for(int i=1; i < src.rows-1;i++) {
for(int j=1;j < src.cols-1;j++) {
uchar lbp = 0;
uchar center = src.at<uchar>(i,j);
//取出對應 高迹缀、寬位置的像素 與 中心點位置進行比較
if(src.at<uchar>(i-1,j-1)>center) { lbp += 1 << 7;}
if(src.at<uchar>(i-1,j )>center) { lbp += 1 << 6;}
if(src.at<uchar>(i-1,j+1)>center) { lbp += 1 << 5;}
if(src.at<uchar>(i ,j+1)>center) { lbp += 1 << 4;}
if(src.at<uchar>(i+1,j+1)>center) { lbp += 1 << 3;}
if(src.at<uchar>(i+1,j )>center) { lbp += 1 << 2;}
if(src.at<uchar>(i+1,j-1)>center) { lbp += 1 << 1;}
if(src.at<uchar>(i ,j-1)>center) { lbp += 1 << 0;}
dst.at<uchar>(i-1,j-1) = lbp;
}
}
}
//讀取一張圖片
Mat img = imread("/path/x.png");
cvtColor(img, img, COLOR_BGR2GRAY);
//計算lbp圖譜
Mat lbp = Mat(img.rows-2, img.cols-2,CV_8UC1);
processLBP(img,lbp);
從lBP定義可以看出LBP是灰度不變的使碾,簡單來說就是對圖像的灰度值根據(jù)一個系數(shù)X進行修改,得出的LBP值不變祝懂。
圓形LBP
? 基本的 LBP算子的最大缺陷在于它只覆蓋了一個固定3x3范圍內的小區(qū)域票摇,為了滿足不同尺寸的需要,并達到灰度和旋轉不變性的要求嫂易,對 LBP 算子進行了改進兄朋,將 3×3鄰域擴展到任意鄰域,并用圓形鄰域代替了正方形鄰域。以某個像素點為中心颅和,以一個任意大小半徑R畫一個圓傅事,將落在圓內的P個像素與中心點像素比較得到LBP算子。
旋轉不變LBP
? LBP 算子是灰度不變的峡扩,但卻不是旋轉不變的蹭越,圖像的旋轉就會得到不同的 LBP值。
為了解決這個問題教届,將 LBP算子進行了擴展具有旋轉不變性响鹃。LBP的旋轉不變模式,即不斷旋轉圓形鄰域得到一系列初始定義的 LBP值案训,取其最小值作為該鄰域的 LBP 值。
首先獲得LBP值為: 11100001 (255),進過旋轉分別得到8中不同的LBP值城舞,最終得到的具有旋轉不變性的 LBP值為 15。
等價LBP
? 對于半徑為R的圓形區(qū)域內含有P個采樣點的LBP算子將會產生2^P(0和1的排列組合)種模式。隨著鄰域集內采樣點數(shù)的增加,二進制模式的種類是以指數(shù)形式增加的。這么多的二進制模式導致在人臉檢測時候LBP模式統(tǒng)計直方圖過于稀疏(見下面檢測原理部分)。因此需要對原始的LBP模式進行降維透葛,也就是減少數(shù)據(jù)量繁调。
? 等價模式(均勻模式)就是解決這個問題的奕翔。在實際圖像中捻艳,絕大多數(shù)LBP模式最多只包含兩次從1到0或從0到1的跳變。因此拳锚,等價模式定義為:當某個LBP所對應的循環(huán)二進制數(shù)從0到1或從1到0最多有兩次跳變時匾荆,該LBP所對應的二進制就稱為一個等價模式類,除等價模式類以外的模式都歸為另一類杆烁,稱為混合模式類牙丽。
? 00000000(0次跳變),00000111(1次從0到1的跳變)兔魂,10001111(1到0烤芦,0到1,兩次跳變)是等價模式類析校。
? 10010111(共四次跳變)是混合模式類构罗。
? 通過這樣的改進,二進制模式數(shù)量由原來的2^P種減少為 P* ( P-1)+2種智玻。
比如:3x3的8采樣本來有256種遂唧,現(xiàn)在變成58(等價模式)+1種(混合模式)。即本來lbp值為0-255吊奢,也就是256種結果盖彭,轉化為了59種。混合模式編碼為0召边,等價模式根據(jù)值大小編碼為1—58铺呵。
00000000 : 1
00000001 : 2
00000010 : 3
00000101 : 0 (跳變3次)
檢測原理
? 將一幅圖片劃分為若干的子區(qū)域,對每個子區(qū)域內的每個像素點都提取LBP特征掌实,然后陪蜻,在每個子區(qū)域內建立LBPH(LBP特征的統(tǒng)計直方圖)。 每個子區(qū)域就可以用一個統(tǒng)計直方圖來進行描述贱鼻;整個圖片就由若干個統(tǒng)計直方圖組成 之后宴卖,將圖片和人臉的直方圖進行相似性比較。
直方圖:
把圖片的亮度分為0到255共256個數(shù)值邻悬,數(shù)值越大症昏,代表的亮度越高。其中0代表純黑色的最暗區(qū)域父丰,255表示最亮的純白色肝谭,而中間的數(shù)字就是不同亮度的灰色。用橫軸代表0-255的亮度數(shù)值蛾扇。豎軸代表照片中對應亮度的像素數(shù)量攘烛,這個函數(shù)圖像就被稱為直方圖。
簡單來說镀首,圖像的直方圖是用來表現(xiàn)圖像中亮度分布的情況,給出的是圖像中某個亮度或者某個范圍亮度下共有幾個像素
直方圖.jpg
參考:
https://www.cnblogs.com/nsnow/p/4461998.html
https://www.cnblogs.com/lxy2017/p/3927280.html