こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

平滑化フィルタ

今、平滑化フィルタを作っています。
下記のようなプログラムであっているのでしょうか?
#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]);
}
}



もっと、効率のよい書き方があれば、アドバイスよろしく
おねがいします。できればサンプルコードをかいていただければ
ありがたいです。

投稿日時 - 2008-06-24 18:17:15

QNo.4126070

すぐに回答ほしいです

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

>今、平滑化フィルタを作っています。
>下記のようなプログラムであっているのでしょうか?

(「ような」を「考え方の」としてアドバイス)

 ダミーデータで試行してみては・・。

   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 とすれば、割らなくてすみます・・。

投稿日時 - 2008-06-25 15:39:12

お礼

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

投稿日時 - 2008-06-26 03:48:57

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

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

投稿日時 - 2008-06-24 23:39:35

補足

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;
}
}



このように訂正したのですがうまくできません・・・

投稿日時 - 2008-06-25 01:30:35

ANo.2

>"sum"が宣言時しか初期化されていないし

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

投稿日時 - 2008-06-24 23:14:43

ANo.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];

投稿日時 - 2008-06-24 22:40:21

あなたにオススメの質問