平均フィルタリングの高速解法
2325 ワード
平均フィルタリングの高速解法
平均フィルタリングは非常に一般的なフィルタリング方法であり、自身のアルゴリズムは難しくないが、当然のことながらアルゴリズムの複雑さはwidth*height*sizeの複雑さであると考えられる.次のheight*width複雑度アルゴリズムを書いてみました.もちろんアルゴリズムは私のオリジナルではありませんが、私が書いただけです.
この高速アルゴリズムの真髄はスライドウィンドウの代わりに配列を採用することである.
以下、5*5の画像に対して3*3の平均フィルタリングを行う例を示す.(height=width=5;size=3)
まず、カラムと配列cur_を作成します.rowSumは、前size(3)行画素の列和に初期化される.
0
5
7
9
0
(1)列と配列が1*width
0
0
0
0
0
0
1
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
(2)オリジナル画像、周囲padが0
1行目の計算は次のように行います.
最初のピクセルの値を計算します.P=cur_rowSum[0..size-1]は、次のピクセルの値がp-最も左の列の列と値に最も右の列の列と値を加えたものです.
0
5
7
9
0
0
0
0
0
0
0
12
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
次の行の画素値を算出する場合もcur_が必要となるrowSum.したがって、最初の行が列和を計算するときに次の「cur_を同時に計算する」rowSum」は,ローの計算に影響を及ぼさないように別の配列で格納する.
計算は、1つの列と、その列の最初の画素を減算し、その列の次の行の画素を加算します.
0
12
7
9
0
0
0
0
0
0
0
1
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
図のように、12=5-0+7;
このようにループを行い,計算が完了するまで配列が境界を越えないように注意する.
次はコードです.
平均フィルタリングは非常に一般的なフィルタリング方法であり、自身のアルゴリズムは難しくないが、当然のことながらアルゴリズムの複雑さはwidth*height*sizeの複雑さであると考えられる.次のheight*width複雑度アルゴリズムを書いてみました.もちろんアルゴリズムは私のオリジナルではありませんが、私が書いただけです.
この高速アルゴリズムの真髄はスライドウィンドウの代わりに配列を採用することである.
以下、5*5の画像に対して3*3の平均フィルタリングを行う例を示す.(height=width=5;size=3)
まず、カラムと配列cur_を作成します.rowSumは、前size(3)行画素の列和に初期化される.
0
5
7
9
0
(1)列と配列が1*width
0
0
0
0
0
0
1
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
(2)オリジナル画像、周囲padが0
1行目の計算は次のように行います.
最初のピクセルの値を計算します.P=cur_rowSum[0..size-1]は、次のピクセルの値がp-最も左の列の列と値に最も右の列の列と値を加えたものです.
0
5
7
9
0
0
0
0
0
0
0
12
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
次の行の画素値を算出する場合もcur_が必要となるrowSum.したがって、最初の行が列和を計算するときに次の「cur_を同時に計算する」rowSum」は,ローの計算に影響を及ぼさないように別の配列で格納する.
計算は、1つの列と、その列の最初の画素を減算し、その列の次の行の画素を加算します.
0
12
7
9
0
0
0
0
0
0
0
1
2
3
0
0
4
5
6
0
0
7
8
9
0
0
0
0
0
0
図のように、12=5-0+7;
このようにループを行い,計算が完了するまで配列が境界を越えないように注意する.
次はコードです.
#include
#include
using namespace std;
void avg_filter(int *src_pad,int height,int width,int size=3){
int *src_pad1=src_pad;
int *temp_src=src_pad1;
vector cur_sumRow(width,0);
// cur_sumRow size , 。
for(int i=0;i temp_sumRow(width,0);
for(int i=size/2;i=size/2&&j