【算法設計】快速計算積分圖

積分圖是圖像中十分經常使用的方法,最初是在Haar特徵的快速計算中學到(參考博文:利用積分圖像法快速計算Haar特徵),後來發如今均值濾波,二值化等圖像處理方法中也十分常見。spa

積分圖的簡要介紹能夠參考博文:利用積分圖像法快速計算Haar特徵,這裏再也不重複了。本篇主要是小記一下積分圖的計算方法。.net

因爲積分圖中每一個單元存儲的信息是原圖中此位置左上角全部像素之和,因此對一張W*H的圖像直接求取積分圖,須要:code

(1+2+...+W-1)*H+(1+2+...+W)*(H=1) = (w-2)*H/(W-1)+2(W+1)*(H-1)/W blog

次加法。get

 

一種簡單的快速計算方法

最直接的快速計算方法是利用以計算積分求當前位置的積分,其思想正如快速計算Haar特徵的方法。

即,Integral(i,j) = Integral(i,j-1) + Integral(i-1,j) - Integral(i-1,j-1) + Image(i,j);
因而,對一張W*H的圖像直接求取積分圖,須要:
(W-1)+(H-1)+3*(W-1)*(H-1)
次加法。代碼以下:
void integral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height){
	// calculate integral of the first line
	for(int i=0;i<width;i++){
		outputMatrix[i] = inputMatrix[i];
		if(i>0){
			outputMatrix[i] += outputMatrix[i-1];
		}
	}
	for (int i=1;i<height;i++){
		int offset = i*width;
		// first column of each line
		outputMatrix[offset] = outputMatrix[offset-width]+inputMatrix[offset];
	    // other columns 
			outputMatrix[offset+j] = outputMatrix[offset+j-1] + outputMatrix[offset-width] + outputMatrix[offset-width-1] + inputMatrix[offset]; 
		}
	}
	return ;
}

改進的快速計算方法

經過觀察上一種方法,發現積分Integral(i,j) 並不須要由三個位置的積分計算出來,只須要左邊Integral(i,j-1)加上當前列的和便可。

即,Integral(i,j) = Integral(i,j-1) + ColumnSum(j);
所以,對一張W*H的圖像直接求取積分圖,只須要:
(W-1)+(H-1)+2*(W-1)*(H-1)
次加法。代碼以下:
void fastIntegral(unsigned char* inputMatrix, unsigned long* outputMatrix, int width, int height){
	unsigned long *columnSum = new unsigned long[width]; // sum of each column
	// calculate integral of the first line
	for(int i=0;i<width;i++){
		columnSum[i]=inputMatrix[i];
		outputMatrix[i] = inputMatrix[i];
		if(i>0){
			outputMatrix[i] += outputMatrix[i-1];
		}
	}
	for (int i=1;i<height;i++){
		int offset = i*width;
		// first column of each line
		columnSum[0] +=inputMatrix[offset];
		outputMatrix[offset] = columnSum[0];
		 // other columns 
		for(int j=1;j<width;j++){
			columnSum[j] += inputMatrix[offset+j];
			outputMatrix[offset+j] = outputMatrix[offset+j-1] + columnSum[j]; 
		}
	}
	return ;
}

(轉載請註明做者和出處:http://blog.csdn.net/xiaowei_cqu 未經容許請勿用於商業用途)

相關文章
相關標籤/搜索