- ベストアンサー
平滑化フィルタ
今、平滑化フィルタを作っています。 下記のようなプログラムであっているのでしょうか? #include<stdio.h> #include<stdlib.h> #include<limits.h> #include "basic_data_struct.h" //関数宣言 unsigned short **us_Calloc1(int width,int height); void filter(imginfo *img) { int box[9]={1,1,1,1,1,1,1,1,1}; //単純平均化 int weight[9]={0}; int i=0,j=0,y,x; //ループ変数 double div_const=9.0; int height,width; height=img->height; //高さ width=img->width; //幅 int sum=0; //合計 unsigned short result=0; //結果 img->data2=us_Calloc1(width,height); //結果を入れる配列を動的に確保(2次元) for(i=1; i<height-1; i++) for(j=1; j<width-1; j++){ box[0]=img->data[i-1][j-1]; box[1]=img->data[i-1][j]; box[2]=img->data[i-1][j+1]; box[3]=img->data[i][j-1]; box[4]=img->data[i][j]; box[5]=img->data[i][j+1]; box[6]=img->data[i+1][j-1]; box[7]=img->data[i+1][j]; box[8]=img->data[i+1][j+1]; sum=(box[0]*weight[0]+box[1]*weight[1]+box[2]*weight[2] +box[3]*weight[3]+box[4]*weight[4]+box[5]*weight[5] +box[6]*weight[6]+box[7]*weight[7]+box[8]*weight[8]); //printf("sum=%d\n",sum); result=(sum/(3*3)); //3*3近傍 img->data2[i-1][j-1]=(unsigned short)result; //結果の代入 //printf("img->data[%d][%d]=%d\n",i,j,img->data[i][j]); } } もっと、効率のよい書き方があれば、アドバイスよろしく おねがいします。できればサンプルコードをかいていただければ ありがたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>今、平滑化フィルタを作っています。 >下記のようなプログラムであっているのでしょうか? (「ような」を「考え方の」としてアドバイス) ダミーデータで試行してみては・・。 iDummy[3][3] = { { 1, 2, 3 }, { 10, 20, 30 }, { 1, 2, 3 } }; img->data を iDummy に置換して。 もちろん、3 * 3 で割っているのだから、weight[] の計(◆)は 9 にして。 >result=(sum/(3*3)); //3*3近傍 もしかして、3*3 は、誤解されてませんか(◆)。 >もっと、効率のよい書き方があれば、アドバイスよろしくおねがいします。 ちょっと見、 sum=(box[0]*weight[0]+box[1]*weight[1]+box[2]*weight[2] +box[3]*weight[3]+box[4]*weight[4]+box[5]*weight[5] +box[6]*weight[6]+box[7]*weight[7]+box[8]*weight[8]); の部分は、 sum = box[ 0 ] * weight[ 0 ]; sum += box[ 1 ] * weight[ 1 ]; sum += box[ 2 ] * weight[ 2 ]; sum += box[ 3 ] * weight[ 3 ]; sum += box[ 4 ] * weight[ 4 ]; sum += box[ 5 ] * weight[ 5 ]; sum += box[ 6 ] * weight[ 6 ]; sum += box[ 7 ] * weight[ 7 ]; sum += box[ 8 ] * weight[ 8 ]; とできます、ということは、・・。 for( sum = 0, k = 0; k < 9; k++ ) sum += ( box[ k ] * weight[ k ] ); ------------------------------------------ ( No.3 さんへの補足ソース) >このように訂正したのですがうまくできません・・・ ★ weight[] の総計(◆)で割らないなんて・・。 まさか、box[] が「加重」じゃあないよね・・。 ならば、「うまく」できるハズ?だから。 蛇足 当たり前ですが、weight[] の総計を 1.0 とすれば、割らなくてすみます・・。
その他の回答 (3)
- yaemon_2006
- ベストアンサー率22% (50/220)
何度も申し訳ない。 訂正 data[i + k / 3][j + k % 3]->data[i + d[k / 3]][j + d[k % 3]]
補足
void filter(imginfo *img) { int box[9]={1,1,1,1,1,1,1,1,1}; int weight[9]={0}; int i=0,j=0; double div_const=9.0; int height,width; int sum=0; unsigned short result=0; height=img->height; width=img->width; img->data2=us_Calloc1(width,height); printf("img->dataのデータをimg->data2に移すことができました.\n"); for(i=1; i<height-1; i++) for(j=1; j<width-1; j++){ weight[0]=img->data[i-1][j-1]; weight[1]=img->data[i-1][j]; weight[2]=img->data[i-1][j+1]; weight[3]=img->data[i][j-1]; weight[4]=img->data[i][j]; weight[5]=img->data[i][j+1]; weight[6]=img->data[i+1][j-1]; weight[7]=img->data[i+1][j]; weight[8]=img->data[i+1][j+1]; sum=(box[0]*weight[0]+box[1]*weight[1]+box[2]*weight[2] +box[3]*weight[3]+box[4]*weight[4]+box[5]*weight[5] +box[6]*weight[6]+box[7]*weight[7]+box[8]*weight[8]); result=(unsigned short)(sum/(3*3)); img->data2[i][j]=(unsigned short)result; sum=0; result=0; } } このように訂正したのですがうまくできません・・・
- yaemon_2006
- ベストアンサー率22% (50/220)
>"sum"が宣言時しか初期化されていないし "sum"が宣言時しか0クリアーされていないし
- yaemon_2006
- ベストアンサー率22% (50/220)
{}の対応が取れてないし、"sum"が宣言時しか初期化されていないし、 何をもって"効率のよい書き方"とするのか判らないけど、 こんなのはどうでしょう。 int d[3] = {-1, 0, 1}; int k; ・・・ for(k = 0; k < 9; k ++) box[k] = data[i + k / 3][j + k % 3]; for(k = 0; k < 9; k ++) sum += box[k] * weight[k];
お礼
ご回答ありがとうございます.