OpenCV學習(四)顏色空間縮減實現
阿新 • • 發佈:2019-01-09
在一幅數字影象儲存的矩陣一般是uchar型別,為8位256個值。如果是三通道圖形,那麼應該有256*256*256=16581375種不同的顏色,這1600多萬種顏色,資料量會很大,影響後期的處理,這個時候,我們就需要將顏色空間進行縮減。
對於三通道影象,本來有256*256*256種顏色,這裡我們取:
0-9的畫素取值:0
10-19的畫素取值:1
……
250-256的畫素取值:25
這樣可以形成一個26*26*26=17576種顏色,我們可以由此寫出顏色空間壓縮的演算法:
intdivide = 10;
uchartable[256];
for(inti=0;i<256;i++){
table[i] = divide*(i/divide);
}
這裡我們取256的原因是:三通道影象的每個通道,其都為uchar型,那麼大小為0-255,一共256個數,所以我們取table的大小為256就可以覆蓋所有的畫素值了。
由此我們對壓縮顏色空間的思路是:對於比較大的影象,我們首先做一個類似的table,裡面儲存計算好的新的壓縮影象可能要取的值,等到需要取值的時候,只要對table進行查詢操作就可以了,無需再計算。
訪問畫素的幾種方法
訪問畫素的方法有:用指標訪問畫素元素,用迭代器訪問元素與動態地址計算。這裡我結合上次的回撥函式,寫了一個用指標訪問元素的例子。例子如下:
/* 使用trackball控制元件實現色彩空間的縮減 piaopiao9393 */ #include<opencv2\core\core.hpp> #include<opencv2\highgui\highgui.hpp> using namespace std; using namespace cv; #define WINDOW_NAME "色彩空間縮減" int compressValue;//壓縮值設為全域性變數 const int maxValue = 100; Mat srcImg;//原影象 Mat dstImg;//處理後的影象 //編寫回調函式 void on_trackBall(int, void*); //編寫縮減色彩控制元件的函式 void colorReduce(Mat& src, Mat& dst, int compress); int main(int argv, char** argc) { srcImg = imread("D:\\123.jpg"); dstImg.create(srcImg.rows, srcImg.cols, srcImg.type()); compressValue = 50; namedWindow(WINDOW_NAME, WINDOW_NORMAL); char trackName[50]; sprintf(trackName, "壓縮值:%d", compressValue); createTrackbar(trackName, WINDOW_NAME, &compressValue, maxValue, on_trackBall); //將結果返回回撥函式 int m = 9; on_trackBall(compressValue, 0); //按任意鍵退出 waitKey(0); return 0; } void colorReduce(Mat& src, Mat& dst, int compress) { dst = src.clone(); int rowNumber = src.rows; int colNumber = src.cols*src.channels(); for (int i = 0; i < rowNumber; i++) { uchar* data = dstImg.ptr<uchar>(i); for (int j = 0; j < colNumber; j++) //注意,這裡compressValue不能取0,否則會有問題 data[j] = (data[j] / compressValue)*compressValue; } } void on_trackBall(int, void*) { colorReduce(srcImg, dstImg, compressValue); imshow(WINDOW_NAME, dstImg); }
程式碼執行結果如下: