• ベストアンサー

平滑化フィルタ

今、平滑化フィルタを作っています。 下記のようなプログラムであっているのでしょうか? #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]); } } もっと、効率のよい書き方があれば、アドバイスよろしく おねがいします。できればサンプルコードをかいていただければ ありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.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 とすれば、割らなくてすみます・・。

ultrabanan
質問者

お礼

ご回答ありがとうございます.

その他の回答 (3)

回答No.3

 何度も申し訳ない。 訂正 data[i + k / 3][j + k % 3]->data[i + d[k / 3]][j + d[k % 3]]

ultrabanan
質問者

補足

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; } } このように訂正したのですがうまくできません・・・

回答No.2

>"sum"が宣言時しか初期化されていないし  "sum"が宣言時しか0クリアーされていないし

回答No.1

 {}の対応が取れてないし、"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];

関連するQ&A

専門家に質問してみよう