1. 程式人生 > >OpenCV學習(四)顏色空間縮減實現

OpenCV學習(四)顏色空間縮減實現

在一幅數字影象儲存的矩陣一般是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);
}

程式碼執行結果如下: