
今、平滑化フィルタを作っています。
下記のようなプログラムであっているのでしょうか?
#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]);
}
}
もっと、効率のよい書き方があれば、アドバイスよろしく
おねがいします。できればサンプルコードをかいていただければ
ありがたいです。
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 とすれば、割らなくてすみます・・。
No.3
- 回答日時:
何度も申し訳ない。
訂正
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;
}
}
このように訂正したのですがうまくできません・・・
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) pythonのグローバル変数 2 2022/11/25 18:02
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- HTML・CSS 【HTML】【CSS】【Swiper】 元の画像は横1200×縦600なのですが、実際のサイト上に反 5 2022/07/16 13:57
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- PHP 共通の処理をまとめる方法がわからないのでアドバイスお願いします。 1 2022/12/19 20:20
- HTML・CSS img と p を縦中央に配置したいのですがうまくいきません。 2 2023/01/12 14:38
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
'dataType' 引数を Null にする...
-
System.Collections.ArrayList ...
-
micropythonコード 修正
-
printfの%eで指数部分の桁数を...
-
構造体のソートの方法について...
-
C言語 ファイル内のデータと入...
-
stable diffusionのエラー
-
C++/CLIのオブジェクト型配列
-
COBOLのCOMP形式について
-
UTF-8で5~6バイトになる文字コ...
-
10Mバイトて文字数に すると何...
-
DataGridViewの特定列に入力さ...
-
perlプログラミング 空白行削除
-
文字列の最後の一字を削除
-
ビットからバイトへの変換
-
ブラウザ間でCookieを共有する...
-
Sys::Syslogモジュールを利用し...
-
Excel 1セル当りの文字数が2...
-
ワイド文字のバイト数が取得で...
-
Rstudioによるテキストマイニン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
printfの%eで指数部分の桁数を...
-
stable diffusionのエラー
-
int型(2バイト)データの分割
-
CreateProcessでの環境変数の設...
-
【Excel VBA】10進数を2進数に...
-
エクセルVBA:日付データの変換...
-
C#でのswitch文
-
Excel VBA グラフ作成のとき...
-
ポインター引数の関数でコンパ...
-
C言語でのLinuxとwindows共通の...
-
C言語の構造体にてバブルソート...
-
sort関数でひらがなとカタカナ...
-
VisualBasicでレジストリキーの...
-
構造体のソートの方法について...
-
RegQueryValueExでの2バイト文字
-
'dataType' 引数を Null にする...
-
ActivePerlでSMTPプロトコルで...
-
POSTで配列のデータを渡す方法は?
-
min_elementの三番目の引数
-
c言語の多次元配列で1から100ま...
おすすめ情報