1. 程式人生 > >灰度不變性LBP( gray scale invariant) 旋轉不變性LBP(rotation invariant)旋轉不變等價LBP(rotation & uniform invarian )

灰度不變性LBP( gray scale invariant) 旋轉不變性LBP(rotation invariant)旋轉不變等價LBP(rotation & uniform invarian )

老外的原文:《Multiresolution gray-scale and rotation invariant texture classification with local binary patterns》 Timo Ojala, Matti PietikaÈ inen,2002

  本文將對這篇文章做部分翻譯,最後將分別給出下列程式碼實現

。灰度不變性LBP( gray scale invariant)

。旋轉不變性LBP(rotation invariant)

。旋轉不變等價LBP(rotation & uniform invariant)

1.INTRODUCTION

   二維紋理分析有許多潛在的應用,比如工業表面檢查、遙感、生物圖片分析,但是隻有很少的例子成功發現了紋理的存在。主要的問題是,在現實世界中,由於方向、尺度及其他視覺外觀的變化導致紋理常常不是均一的。灰度尺度不變性通常變得非常重要,因為不均勻的光照或影象內大幅變化。另外,已經提出的紋理測量演算法計算量太大【比如灰度共生矩陣,我加的】。

  絕大多數紋理分類方法都顯式或隱式的假設,待分類的未知樣本與訓練樣本在在空間大小、方向和灰度尺度屬性上都一致。然而,現實世界的紋理受變化的光照條件影響,可以存在任意空間解析度和旋轉方向。

  然後,羅列了一堆前人的工作......

  在老外這篇文章中,老外提出了一種計算量小並且可以有效檢測大量旋轉和灰度尺度不同的紋理。他們提出一種基於Local Binary Patterns【LBP特徵】 的灰度尺度不變性和旋轉不變性的紋理運算元。從區域性鄰域的圓形區域內畫素灰度的聯合分佈開始,他們推導了一個運算元,對任何單調的灰度尺度變化都能顯示不變性。旋轉不變性是通過灰度尺度不變運算元配合一系列旋轉不變模式實現的。

 【我這算直譯的,不通也是常理,下面開始重點了】

  2.GRAY SCALE AND ROTATION INVARIANT LOCAL BINARY PATTERNS

   定義紋理 T 為一副黑白紋理影象區域性鄰域內影象畫素灰度的聯合分佈:


  其中,gc 對應區域性鄰域中心畫素的灰度值,gp (p = 1,2,...,P-1)對應半徑為 R 的圓形對稱鄰域內 P等分的畫素灰度。如果 gc 座標為 (0,0),那麼 gp 的座標為…(- R sin…(2πp/P),R cos… (2πp/P))†。如下圖所示,為不同取樣點 P 和半徑 R 的圓形對稱鄰域。其中對於鄰域內那些沒有直接落在畫素【方格】中央的點的灰度值將通過二線性插值

完成。


2.1  Achieving Gray-Scale Invariance

   首先,我們將鄰域內中心畫素點 gc 的灰度值與圓形對稱區域內其他點 gp 的灰度值相減:


  接下來,我們假設差分 gp - gc  和 gc 是相互獨立的,於是就有:


  在實際中,這種直接獨立是不能被保證的,因此上式僅是聯合分佈的一種近似。由於分佈 t ( gc )描述了影象整體光照,因此沒有給紋理分析提供有用的資訊。這樣,紋理特徵可以由以下聯合差分分佈表示:


  這是一個具有高度判別性的紋理運算元。它在 P 維直方圖中,記錄了每個畫素點的鄰域中模式變化的發生次數。對於恆定的區域,所有方向的差分均為 0。對於緩慢的斜邊,該運算元記錄了梯度方向最大的差分,沿著邊的方向差分為0 。對於一個斑點,所有方向的差分都很大。

  帶符號差分 gp - gc 不受平均光源變化影響。因此,聯合差分分佈對於灰度尺度變化具有不變性。我們通過僅使用差分的符號,而不是差分本身的值來實現灰度尺度不變性:


  通過對每個符號 s( gp - gc ) 賦予因子2^P,我們將上述公式變成唯一的 LBP值,用來描述區域性影象紋理的空間結構:


當P=8,R=1時,這裡的LBP值和經典的LBP值很相似,但差別在於,這邊取樣區域為圓形,且畫素值必須通過二線性插值獲得。

2.2 Achieving Rotation Invariance

上述LBP運算元將產生 2^P 個不同輸出,對應由鄰域內P個畫素點形成的2 ^ P個不同二進位制模式。當影象被旋轉,【以下為意譯】,灰度值gp 和g0的相對位置將發生變化,而g0通常取中心 gc 的正右 ,座標(0,R) ,這會導致不同的LBP值。但任何角度的旋轉不影響,圓形對稱鄰域內 0 和 1 的相對位置關係,為了移除旋轉獲得唯一的LBP值,我們定義:


 其中,ROR(x,i)執行沿時鐘方向將P位數 X 移動 i 次。對於影象畫素而言,就是將鄰域集合按照時鐘方向旋轉很多次,直到當前旋轉下構成的LBP值最小。【即文中所說的,最重要位的最大值為0,即gp-1為0】

 如下圖所示,對於8個取樣點,將有36種唯一的旋轉不變二值模式:【黑點為0,白點為1】


2.3  Improved Rotation Invariance with ªUniformº Patterns

  對於8個取樣點,灰度不變性LBP將產生256中輸出,旋轉不變性LBP將產生36個輸出,而基於unifrom的旋轉不變LBP將只有9中輸出。【uniform形式有58中輸出】

  【上面講的種類對於後面程式設計實現,計算對映mapping很重要】

  首先介紹什麼是uniform,它是指均勻環形結構內包含非常少的空間轉換。我們定義U(pattern),用來記錄空間轉換的數量,即0-1變化的次數。比如,上圖第一行中00000000和11111111,它們的U值均為0,而其餘種類的U均為2.類似的,上述其他27中模式的 U 值至少為4。我們將 U 值為2的模式稱為 uniform

那麼:

  對於8個取樣點,共有58種唯一的 uniform型別的LBP值輸出【此處沒考慮旋轉不變性,58種輸出是LBP的2進位制值,而非U值,U值都是2】,如下圖所示:


關於uniform輸出的種類,並不在該論文中,屬於題外話,因為有人直接拿uniform形式去提取LBP特徵。詳情見《Rotation Invariant Image Description with Local Binary Pattern Histogram Fourier Features》一文。

接下來繼續介紹基於uniform的旋轉不變LBP,我們定義如下公式:



其中,P為取樣點個數。

3.具體實現

 下面程式碼用C實現,讀入一副灰度影象,取樣點個數,取樣半徑,對每個畫素計算LBP特徵並輸出,LBP影象及其直方圖。

  對於旋轉不變性及uniform旋轉不變性,我沒有對每個畫素都進行上述公式的操作,由於是2進位制的圓形迴圈,可以提前做個mapping對映關係,加快程式執行速度。

 取樣點數量均為8,取樣半徑為10

輸入影象:


3.1 灰度不變性LBP:

  1. void gray_invariant_lbp(IplImage *src,int height,int width,int num_sp,MyPoint *spoint)  
  2. {  
  3.     IplImage *target,*hist;  
  4.     int i,j,k,box_x,box_y,orign_x,orign_y,dx,dy,tx,ty,fy,fx,cy,cx,v;  
  5.     double min_x,max_x,min_y,max_y,w1,w2,w3,w4,N,x,y;  
  6.     int *result;  
  7.     float dishu;  
  8.     dishu = 2.0;  
  9.     max_x=0;max_y=0;min_x=0;min_y=0;  
  10.     for (k=0;k<num_sp;k++)  
  11.     {  
  12.         if (max_x<spoint[k].x)  
  13.         {  
  14.             max_x=spoint[k].x;  
  15.         }  
  16.         if (max_y<spoint[k].y)  
  17.         {  
  18.             max_y=spoint[k].y;  
  19.         }  
  20.         if (min_x>spoint[k].x)  
  21.         {  
  22.             min_x=spoint[k].x;  
  23.         }  
  24.         if (min_y>spoint[k].y)  
  25.         {  
  26.             min_y=spoint[k].y;  
  27.         }  
  28.     }  
  29.     //計算模版大小
  30.     box_x = ceil(MAX(max_x,0)) - floor(MIN(min_x,0)) + 1;  
  31.     box_y = ceil(MAX(max_y,0)) - floor(MIN(min_y,0)) + 1;  
  32.     if (width<box_x||height<box_y)  
  33.     {  
  34.         printf("Too small input image. Should be at least (2*radius+1) x (2*radius+1)");  
  35.         return;  
  36.     }  
  37.     //計算可濾波影象大小,opencv影象陣列下標從0開始
  38.     orign_x = 0 - floor(MIN(min_x,0));//起點
  39.     orign_y = 0 - floor(MIN(min_x,0));  
  40.     dx = width - box_x+1;//終點
  41.     dy = height - box_y+1;  
  42.     int cols = pow(dishu,(float)num_sp);  
  43.     hist = cvCreateImage(cvSize(300,200),IPL_DEPTH_8U,3);//直方圖影象
  44.     target = cvCreateImage(cvSize(dx,dy),IPL_DEPTH_8U,1);  
  45.     result = (int *)malloc(sizeof(int)*dx*dy);  
  46.     double *val_hist = (double *)malloc(sizeof(double)*cols);   //直方圖陣列
  47.     memset(result,0,sizeof(int)*dx*dy);  
  48.     CvRect roi =cvRect(orign_x, orign_y, dx, dy);  
  49.     cvSetImageROI(src, roi);  
  50.     cvCopy(src, target);    
  51.     cvResetImageROI(src);  
  52.     cvSaveImage("haha.jpg",target);  
  53.     for ( k = 0; k<num_sp;k++)  
  54.     {  
  55.         x = spoint[k].x+orign_x;  
  56.         y = spoint[k].y+orign_y;  
  57.         //二線性插值影象
  58.         fy = floor(y);  //向下取整
  59.         fx = floor(x);  
  60.         cy = ceil(y);   //向上取整
  61.         cx = ceil(x);  
  62.         ty = y - fy;  
  63.         tx = x - fx;  
  64.         w1 = (1 - tx) * (1 - ty);  
  65.         w2 = tx  * (1 - ty);  
  66.         w3 = (1 - tx) * ty ;  
  67.         w4 = tx * ty ;  
  68.         v = pow(dishu,(float)k);  
  69.         for (i = 0;i<dy;i++)  
  70.         {  
  71.             for (j = 0;j<dx;j++)  
  72.             {  
  73.                 //灰度插值影象畫素
  74.                 N = w1 * (double)(unsigned char)src->imageData[(i+fy)*src->width+j+fx]+  
  75.                       w2 * (double)(unsigned char)src->imageData[(i+fy)*src->width+j+cx]+  
  76.                       w3 * (double)(unsigned char)src->imageData[(i+cy)*src->width+j+fx]+  
  77.                       w4 * (double)(unsigned char)src->imageData[(i+cy)*src->width+j+cx];  
  78.                 if( N >= (double)(unsigned char)target->imageData[i*dx+j])  
  79.                 {  
  80.                     result[i*dx+j] = result[i*dx+j] + v * 1;  
  81.                 }else{  
  82.                     result[i*dx+j] = result[i*dx+j] + v * 0;  
  83.                 }  
  84.             }  
  85.         }  
  86.     }  
  87.     //顯示影象
  88.     if (num_sp<=8)  
  89.     {  
  90.         //只有取樣數小於8,則編碼範圍0-255,才能顯示影象
  91.         for (i = 0;i<dy;i++)  
  92.         {  
  93.             for (j = 0;j<dx;j++)  
  94.             {  
  95.                 target->imageData[i*dx+j] = (unsigned char)result[i*dx+j];  
  96.                 //printf("%d\n",(unsigned char)target->imageData[i*width+j]);
  97. 相關推薦

    變性LBP( gray scale invariant) 旋轉變性LBP(rotation invariant)旋轉等價LBP(rotation & uniform invarian

    老外的原文:《Multiresolution gray-scale and rotation invariant texture classification with local binary patterns》 Timo Ojala, Matti PietikaÈ

    拒絕客戶、引導客戶、靈活-過度交付

    我的鄰居小路入職三年,脾氣雖有點兒急躁,但工作還算勤勉。 他近來悶悶不樂,總有意無意提起想辭職。我問出了什麼事,他一臉委屈和困惑。 公司空缺了一個組長職位。他跟同事小李都努力爭取。 “新接了專案,小李說客戶的要求超出合約,拒絕合作。為此,我盡力服務客戶,連續加班三晚。” 但最

    共生矩陣(GLCM,Gray-Level Co-occurrence Matrix

    概念 由於紋理是由灰度分佈在空間位置上反覆出現而形成的,因而在影象空間中相隔某距離的兩畫素之間會存在一定的灰度關係,即影象中灰度的空間相關特性。灰度共生矩陣就是一種通過研究灰度的空間相關特性來描述紋理的常用方法。 灰度共生矩陣是涉及畫素距離和角度的矩陣函式,它通過計算影象中一定距離和

    二值影象:B&W(黑白影象)、 Gray (影象) 、單色影象//Color(彩色影象)

    二值影象(binary image),即影象上的每一個畫素只有兩種可能的取值或灰度等級狀態,人們經常用黑白、B&W、單色影象表示二值影象。 B&W黑白影象: 只有黑色和白色,不存在過渡性的灰色,它一個畫素只需要一個二進位制位就能表示出來,即0表示

    matlab函式mapminmax適用與於影象處理中的級的擴充套件與壓縮

    以下例子用於說明該問題:在使用laplacian進行影象銳化時,我們會遇到資料型別的轉化,同時伴隨著產生了灰度級的擴充套件與壓縮的問題。(使用matlab程式設計)I = imread('2.jpg'); I_g = rgb2gray(I); imtool(I_g,[]) %

    直方圖及處理“cvQueryHistValue_1D”: 找到識別符號”的問題(上

    // HIstogram.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #include "opencv2/opencv.hpp" #define cvQu

    java:影象(BufferedImage)色彩空間轉換()暨獲取影象矩陣資料byte[](sRGB/gray)

    ColorConvertOp java.awt.image包下面有個類java.awt.image.ColorConvertOp,類名直譯就是”顏色轉換操作”。 顧名思義,它的作用就是將一個色彩空間(color space)的影象轉換為另一個色彩空間的影象。

    基於cookie在nginx實現業務發布

    灰度基於cookie在nginx實現業務灰度發布背景灰度發布是指在黑與白之間,能夠平滑過渡的一種發布方式。灰度發布可以保證整體系統的穩定,在初始灰度的時候就可以發現、調整問題,以保證其影響度。業務存在灰度發布的需求,可以通過nginx+lua形式實現業務的灰度發布,目前這一形式已在廣平互動廣告相關業務已經實現

    OpenCv關於積分圖的SSE代碼學習和改進。

    row 關於 分代 移動 運用 別了 增加 字節數 需要   最近一直沈迷於SSE方面的優化,實在找不到想學習的參考資料了,就拿個筆記本放在腿上翻翻OpenCv的源代碼,無意中看到了OpenCv中關於積分圖的代碼,仔細研習了一番,覺得OpenCv對SSE的靈活運用真的做的很

    【數字圖像處理】五.MFC圖像點運算之線性變化、非線性變化、閾值化和均衡化處理具體解釋

    tput rgb 強制轉換 spa ros 例如 read 算法 nload 本文主要講述基於VC++6.0 MFC圖像處理的應用知識,主要結合自己大三所學課程《數字圖像處理》及課件進行解說。主要通過MFC單文檔視圖實現顯示BMP圖片

    前端設計之值利用

    十分 實例代碼 必須掌握 span log bsp img tle stat 在前端設計中,圖片的灰度與彩色交互變化是十分有用且必須掌握的。 充分的利用色差的變化可以給瀏覽者帶去別致的體驗。 實例代碼如下: <img class="filter" sr

    發布

    作用 灰度 影響 ont 能夠 產品測試 覆蓋 分用 繼續 背景 互聯網產品有一個特點,就是不停的升級,升級,再升級。一般采用敏捷開發的團隊,基本上保持每周一次的發布頻率,系統升級總是伴隨著風險,新舊版本兼容的風險,用戶使用習慣突然改變而造成用戶流失的風險,系統down機的

    A/B測試與發布

    目的 目標 交互 交付 場景 範圍 識別 需要 積累 1、A/B測試與灰度發布的理論 產品是多維度的,設計體驗、交互體驗、系統質量、運營支持等等, 測試的目的是為了系統最終的交付,一套各方面都足夠好的系統,而不是文檔上定義的系統,系統是需要不斷進化的。 測試的質疑貫穿產品的

    C#實現把彩色圖片化代碼分享

    turn pub mil int stride 方法 wid blue 節點 彩色圖片轉為灰度圖的公式如下: 代碼如下: gray(i,j) = 0.299 * Red(i,j)+0.587*Green(i,j)+0.114*Blue(i,j) 其中gray(i,j

    vs2015+opencv3.3.1 實現 高斯濾波器

    3.3 edwin ont eight end wid img pre i++ #include <opencv2\highgui\highgui.hpp> #include <iostream> #include<vector> u

    C#getPixel和內存法讀取圖信息

    max post scan ppa private p s pda unlock bsp getPixel方法: private int getPixels(Bitmap bmpobj) { int[,] data

    【微服務從入門到精通】:(一微服務的藍綠發布及發布

    采樣 前端 入門 後端 blog 文件 風險 性能 切換 藍綠部署 基本上,藍綠部署是一種以可預測的方式發布應用的技術,目的是減少發布過程中服務停止的時間。 簡單來說,你需要準備兩個相同的環境(基礎架構),在藍色環境運行當前生產環境中的應用,也就是舊版本應用,如圖中 A

    圖像的直方圖

    bst line [] 數據 mat == str body system 主要代碼如下: package chapter6; import java.awt.*; import java.awt.geom.Rectangle2D; import java.awt.imag

    瓦力安裝之發布

    bower php.ini 遇到的問題 log sta table gre idt bow 在這裏稍微總結一下上周主要完成的任務: 0、什麽是瓦力 1、環境介紹 2、安裝瓦力 3、瓦力安裝中遇到的問題 4、二次修改瓦力,實現灰度發布流程 一、什麽是瓦力 Walle 是一個w

    【OpenCV】圖像增強---變換、直方圖均衡化

    test 增強 映射 display 得到 .cpp scalar pic 重要 圖像增強的目的:改善圖像的視覺效果或使圖像更適合於人或機器的分析處理。通過圖像增強,可以減少圖像噪聲,提高目標與背景的對比度,也可以增強或抑制圖像中的某些細節。 -------------