2. 判斷程式的執行效率
3. 訪問影象中畫素的方法
參考文獻
影象的本質是矩陣,是由乙個個的畫素點組成的。儲存資料往往會占用巨大的空間。假如的單通道的黑白,每個畫素點用0-255這256個數字來表示顏色。而如果是三通道的彩色,則每個畫素點就有256x256x256種可能的顏色,這無疑對於資料儲存來說是筆巨大的開銷。
如果對色彩空間進行縮減,可以有效的減少資料儲存壓力。我們可以通過對顏色進行近似表示的方法,縮減色彩空間。比如對於乙個通道256種顏色:0-10表示為0,11-20表示為1…以此類推,那麼我們就僅需要26個數字來表示乙個通道的顏色,對於三通道彩色圖來說,這個儲存空間壓縮比例就更加客觀了,256x256x256減少到了26x26x26。
如何實現這種顏色近似表示呢?在c++中,int型別除法具有截斷小數點位數的功能,就可以通過這種方法,處理色彩空間,公式如下
i ne
w=io
ld10∗
10inew=\frac*10
inew=1
0iol
d∗1
0舉例:
iold = 23,則inew=23/10*10=2*10=20
但是如果所有的畫素點都要做一次近似計算,也是一種巨大的運算量。所以,我們可以利用查表的思想簡化這一過程。我們可以建立一張記錄了0-256分別對應變換以後哪個數字的表,這樣就不需要每次都計算了,而是查詢變換表即可。
//查詢表的建立
uchar table[
256]
;int dividewidth =
100;
for(
int i =
0; i <
256; i++
)
然後假設中每乙個畫素點為p[i],則通過下列變換即可實現色彩空間縮減
p[i]
=table[p[i]
];
opencv中內建了乙個查詢表函式lut,用來做色彩空間壓縮。其函式定義為:
void
lut(inputarray src, inputarray lut, outputarray dst)
;
使用例子
#include
#include
using
namespace cv;
using
namespace std;
intmain()
//定義
mat srcimg, lut, dstimg;
srcimg =
imread
("1.png");
//建立查詢表
lut.
create(1
,256
, cv_8uc1)
;//查詢表乙個通道就可以,處理三通道的時候,會把三個通道都安裝lut的規則進行變換
uchar* p = lut.data;
for(
int i =
0; i <
256; i++
)//查詢表函式
處理影象就必須了解影象處理演算法的執行效率,這個可以通過程式的執行時間判斷,有這樣兩個函式:
double
gettickfrequency()
;//指示1秒鐘cpu能夠執行多少個週期
int64 gettickcount()
;//用來判斷cpu當前的執行週期
通過這兩個函式我們就能夠判斷乙個程式的執行時間,舉例如下:
double t1=
(double
)gettickcount()
;//do something
t1 =((
double
)gettickcount()
-t1)
/gettickfrequency()
; cout << t1 << endl;
通過指標訪問畫素的特點是:速度最快,但是指標本身就具有不安全的特性。
寫法如下:
#include
#include
using
namespace cv;
using
namespace std;
void
colorreduce
(mat& srcimg, mat& dstimg,
int dividedvalue)
//記錄資料
int row = srcimg.rows;
int col = srcimg.cols;
int channel = srcimg.
channels()
; srcimg.
copyto
(dstimg)
;//使用指標的方法訪問畫素
for(
int i =
0; i < row; i++)}
}int
main()
#include
#include
using
namespace cv;
using
namespace std;
void
colorreduce
(mat& srcimg, mat& dstimg,
int dividedvalue)
//記錄資料
int row = srcimg.rows;
int col = srcimg.cols;
int channel = srcimg.
channels()
; srcimg.
copyto
(dstimg)
;switch
(channel)
break;}
//處理三通道的彩色圖
case3:
break;}
}}intmain()
這裡要注意乙個問題,當case語句裡面定義變數的時候,一定要加{},否則會報錯
動態記憶體使用mat類的at方法進行,特點是:直觀,能夠非常方便的看出行列值
寫法如下:
#include
#include
using
namespace cv;
using
namespace std;
void
colorreduce
(mat& srcimg, mat& dstimg,
int dividedvalue)
//記錄資料
int row = srcimg.rows;
int col = srcimg.cols;
int channel = srcimg.
channels()
; srcimg.
copyto
(dstimg)
;switch
(channel)
}break;}
//處理三通道的彩色圖
case3:
}break;}
}}intmain()
[1] opencv學習筆記二(scan images)
[2] 再談opencv中查詢表lookup table的lut函式
學習opencv opencv人臉檢測
首先利用opencv自帶的訓練檔案haarcascade frontalface alt.xml和haarcascade eye.xml檢測人臉及人眼,其次初步嘗試如何利用opencv訓練資料以及獲得訓練檔案 xml void detectmultiscale const mat image,cv ...
opencv(2) 處理畫素值
opencv中使用mat資料型別表示影象,這是類似int float等傳統型別的一種opencv中定義的資料型別。opencv常見的資料型別 point 代表二維點,用於影象座標點。如point 20,80 scalar 表示4元素標量,常用於rgb顏色值,一般第四個引數用不到。畫素是由顏色空間或通...
OpenCV OpenCV中GPU模組使用
cuda基本使用方法 在介紹opencv中gpu模組使用之前,先回顧下cuda的一般使用方法,其基本步驟如下 1.主機 執行 2.傳輸資料到gpu 3.確定grid,block大小 4.呼叫核心函式,gpu執行程式 5.傳輸結果到cpu 6.繼續主機 執行。下圖是兩個向量相加的簡單示例程式和處理流圖...