彩色影象是由三個通道畫素組成,通道排序分別是bgr,每個數字都是八位無符號字元即0~255。為了簡化分析,會需要減少影象中顏色的數量。當div=8是,原影象的畫素從256x256x256變為32x32x32 = (256/div) x (256/div) x (256/div)。
函式簽名 void colorreduce(mat image,int div)
//這裡div就是減色因子
當是對同一張進行處理,後文會有關於不在原影象上處理的方法,應為如果使用=賦值,只是把被賦值的變數指向同賦值的變數的同乙個資料緩衝區。就如同對的某乙個位置插入logo就是這個原理。
這裡是通過指標進行影象掃瞄的,關於指標可以看看
指標是儲存變數位址的變數,實質還是乙個變數。
void
colorreduce
(mat image,
int div)
//一行行結束
}}
這裡是通過int的整數除法的性質,將不能被減色因子整除的部分給放棄掉。這就是基本的實現原理。後續的只是使用速度更快的編碼方式或者增加新的功能進行基礎減色函式的改動。
也可以通過取餘的方法達到上述效果
data[i]
= data[i]
-data[i]
*div+div/
2;
在指標部分可以採用另一種等價的做法,利用指標運算從一列移動到下一列。
*data++
=*data/div*div +div/
2;
由於c++中儲存資料的格式是二進位制,英雌可以使用位運算子,通過變數右移一位從而完成除以2的操作。
所以這裡可以通過位與預算實現減色運算
uchar mask =
0xff
<
/*div = pow(2,n);當div=16時 mask = 0xf0~1111 000 ;
當div=64時 mask = 0xc0~1100 000*/
*data &
= mask;
//進行掩碼,
*data++
+= div>>1;
//加上div/2
通過與運算將不能被16或者64整除的部分給取零,只是留下整數部分。
函式簽名
void colorreduce(const mat &image(//輸入影象), mat &result(//輸出影象), int div)
注意: 這裡輸入影象是乙個應用的const。表示這幅影象不會在函式中修改
由於需要重新分配矩陣。
result.
create
(image.rows,image.cols,image.
type()
);
過程中會需要使用兩個指標,分別指向result和image。
for
(int i =
0; i
)}
整體**
#include
#include
#include
using
namespace cv;
using
namespace std;
//減色函式
void
colorreduce
(mat image,
int div)
//一行行結束}}
intmain()
原圖
減色後
OpenCV學習 OpenCV中的工具函式
opencv庫中還提供了一些專用功能,可以更好的處理計算機視覺中普遍出現的數學和其他問題。在庫的環境中它們被稱為工具函式。工具函式包含數學操作 測試 錯誤生成 記憶體與執行緒處理 優化及其他的工具。函式名稱 描述cv alignptr 對齊指標到給定位元組數 cv alignsize 將緩衝區大小給...
Opencv學習 LUT函式
lut look up table 查詢表,我表達能力不好,加上對這個了解的不是很深刻,對於lup具體解釋用文字不好說。不過看下面例子應該可以看懂。首先我們看單通道影象。對於8位單通道,其畫素灰度為0 255,假如我們想將影象某一灰度值換成其他灰度值,用查詢就很好用。當把此 應用到時,0 100灰度...
OpenCV基本函式學習
include highgui.h int main int argc,char argv include highgui.h int main int argc,char argv cvreleasecapture capture cvdestroywindow example2 include ...