放射状ブラー C言語で書いたのですが結果がうまくいっていない
こんばんは!
Windows環境,VS2005で放射状ブラーを以下の様に書きましたが、
結果が添付ファイルの様になってしまい、うまくいきません。
コンパイルは通り実行もできるのですが、結果がうまくいっていないのです。(いろんな画像で試しましたが明らかに
うまくいっていない気がするのです)
参考にしたのは、
http://www.sbcr.jp/books/download/art.asp?newsid=2198
の
" 第3章 エフェクト処理の応用(その1) IPP_Chap3a.zipの中にある
list3_14.cです。
又、web上では、http://d.hatena.ne.jp/matsu4512/20090726/1248575190
参考にしました。
以下が私が書いたものです。Input=24bppのrawファイル名
幅、高さが入った構造体です。
プログラミング思想としては、1次元配列で画像を表しています。
#define NN 17
#define NF 8
int Main24bppToRadialBlur(COMMONDATA *Common_Data_Raw)
{
FILE *fpt;
FILE *fpt_output;
int width=Common_Data_Raw->width;
int height=Common_Data_Raw->height;
int i;
unsigned char *layer,*img_output;
int rr,gg,bb,oo;
int x1=0;
int y1=0;
int x2=3*width-3;
int y2=3*width*height-3*width;
WCHAR DebugStr[256];
double ox,oy;
ox=(double)(x2-x1)/2.0;
oy=(double)(y2-y1)/2.0;
double dx,dy;
dx=(double)x2-ox;
dy=(double)y2-oy;
double disMAX;
disMAX=sqrt(dx*dx+dy*dy);
int x,y;
int xx,yy;
double rate,rad=0,dis,disI;
int pat_sum,pat;
double ef=30.0;
_wfopen_s(&fpt,Common_Data_Raw->filename,L"rb");
layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
//読み込み
fread(&layer[0],sizeof(unsigned char),3*width*height,fpt);
img_output=(unsigned char*)malloc(3*width*height*sizeof(unsigned char));
//◆画像処理をするスペース
for(y=y1;y<=3*width*height-3*width;y+=3*width)
{
for(x=x1;x<=3*width-3;x+=3)
{
rr=gg=bb=oo=0;
dx=(double)x-ox;
dy=(double)y-oy;
if(dx!=0.0)
{
rad=atan(dy/dx);
}
else
{
rad=3.14159265/2.0;
}
//rad+=(3.14159265/2.0);
dis=sqrt(dx*dx+dy*dy);
rate=ef*dis/disMAX;
rate/=((double)NF);
pat_sum=0;
for(i=0;i<NN;i++)
{
if(i==NF)
{
pat=3;
}
else
{
pat=1;
}
disI=(double)(i-NF)*rate;
xx=(int)(disI*cos(rad))+x;
yy=(int)(disI*sin(rad))+y;
rr+=layer[xx+yy] * pat;
gg+=layer[xx+yy+1]* pat;
bb+=layer[xx+yy+2]* pat;
oo+= pat;
pat_sum+=pat;
}
img_output[x+y]=rr/(oo);
img_output[x+y+1]=gg/(oo);
img_output[x+y+2]=bb/(oo);
}//x
}//y
_wfopen_s(&fpt_output,L"RGBToRadialBlur.raw",L"wb");
fwrite(&img_output[0],sizeof(unsigned char),3*width*height,fpt_output);
fclose(fpt);
fclose(fpt_output);
free(layer);
free(img_output);
お礼
URLは正しくありませんと出ます。画像の上や動画画面上にマウスを持っていくと ↓Download と出ます。ブラウザはchrome、safari両方で出ます。