ガウシアンフィルタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
TOA

ガウシアンフィルタ

#1

投稿記事 by TOA » 6年前

画像のガウシアンフィルタを作成しています。
カーネルサイズ,標準偏差(σ)を引数として重みを計算し,平滑化を行おうとしています。
size=3, sigma=1.0として,
下記のソースで平滑化はできている(?)と思うのですが,計算後のカーネルサイズ内での重み総和が1とにならず,画像全体が暗くなってしまいます。
なにか解決策はないでしょうか?ご教授お願いします。

コード:

GaussianFilter(int size, double sigma){
	int i,j,k,l,x,y;
	int k_x,k_y;

	double mask;
	double gauss_mask ;
	double PI = 3.141592;
	double gauss_const = 1.0 / (2.0 * PI * sigma * sigma);

	for(i=0;i<Height;i++){//Height:画像サイズ高さ
		for(j=0;j<Width;j++){//Height:画像サイズ幅
         gauss_mask = 0;
                    mask = 0;
			for(k=0; k<size; k++){
				for(l=0; l<size; l++){
					x=i+k-size/2;
					y=j+l-size/2;
					k_x = k - size/2;
					k_y = l - size/2;
					if( (x>=0 && x<Height) &&  (y>=0 && y<Width)){//端処理
						mask = gauss_const*exp(-(( (k_y)*(k_y)+(k_x)*(k_x) ) / (2*sigma*sigma) ));
						edge_mask += m_ImgGray[x][y] * mask; //m_ImgGray[x][y]:輝度値
					}
					else{
						edge_mask +=0;
					}
                                }
                         }
			if(edge_mask >=0){
				m_ImgMask[i][j] = edge_mask;//平滑化後の値を代入
			}
			else if(edge_mask < 0){
				m_ImgMask[i][j] = 0;
			}
                }
        }
}

アバター
usao
記事: 1550
登録日時: 6年前

Re: ガウシアンフィルタ

#2

投稿記事 by usao » 6年前

>計算後のカーネルサイズ内での重み総和が1とにならず,画像全体が暗くなってしまいます。
というところまでわかっているのであれば,重み総和を計算して正規化すればよいのではないでしょうか.

計算内容まで見ていませんが
21行目のmaskが各画素にかけている重みであろうと見受けます.
・変数 sum_weight を追加
・13行目あたりに画素位置(i,j)毎の初期化 sum_weight = 0;
・22行目あたりで sum_weight += mask; として,画素位置(i,j)の計算に用いたmaskの総和を計算
・30行目を m_ImgMask[j] = edge_mask / sum_weight; として正規化
…くらいでどうでしょう?

ところで
edge_mask と書かれている箇所は gauss_mask ではないでしょうか?

あと,全体的に 変数名を役割にあわせると見やすくなると思います.

TOA

Re: ガウシアンフィルタ

#3

投稿記事 by TOA » 6年前

>>usaoさん

返信遅くなってすみません。

暗くなるのは正規化で解決しました。
今後、変数名の決定を考慮しながらソースを組んでいきたいと思います。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る