使用環境はubuntu18.04です。
画像ファイルを読み込んだ後に周りの端っこの1マス以外フィルタをかけたつもりなのですがとても大きい値が帰ってきます。理由が知りたいです。
sobelフィルタの横方向のフィルタを使用しました。画像からr,g,bをとりだしフィルタをかけました。```C言語
コード
#include <gd.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(const int argc,const char *argv[]){ FILE *out,*in; gdImagePtr im,im_new; int width,height,i,j,color,r,g,b,pixel; int weightX[3][3]={ {-1, 0, 1}, {-2, 0, 2}, {-1, 0, 1} }; if(argv[1]==NULL||argv[2]==NULL||!strcmp(argv[1],argv[2])){ printf("argument error\n"); exit(-1); } //第一引数で指定されたファイルを読み出し用にオープン if((in=fopen(argv[1],"r"))==NULL){ printf("file open error for %s\n",argv[1]); exit(-1); } //第二引数で指定されたファイルを書き出し用にオープン if((out=fopen(argv[2],"wb"))==NULL){ printf("file open error for %s\n",argv[2]); exit(-1); } //im に画像を読み込み im = gdImageCreateFromJpeg(in); //入力画像のサイズを取得 width=gdImageSX(im); height=gdImageSY(im); //新しい画像を用意 im_new= gdImageCreateTrueColor(width,height); for(i=0;i<width;i++){ for(j=0;j<height;j++){ int rX=0,gX=0,bX=0,p=0; if(i==0 || j==0 || i==width-1 || j==height-1){ //im の (i,j) におけるカラーインデックスの取得 pixel=gdImageGetPixel(im,i,j); //im の (i,j) における r,g,b の値を取得 r=gdImageRed(im,pixel); g=gdImageGreen(im,pixel); b=gdImageBlue(im,pixel); p=0.298912*r+0.586611*g+0.114478*b; } else{ for(int a=0;a<3;a++){ for (int b=0;b<3;b++){ pixel=gdImageGetPixel(im,i+a-1,j+b-1); r=gdImageRed(im,pixel); g=gdImageGreen(im,pixel); b=gdImageBlue(im,pixel); //フィルターをかける rX=rX+r*weightX[a][b]; gX=gX+g*weightX[a][b]; bX=bX+b*weightX[a][b]; } } rX=rX/9; gX=gX/9; bX=bX/9; rX>255?255:rX<0?0:rX; gX>255?255:gX<0?0:gX; bX>255?255:bX<0?0:bX; p=rX; if(p<gX) p=gX; if(p<bX) p=bX; printf("%d\n",p); } // p=0.298912*r+0.586611*g+0.114478*b; //r,g,b 値から color を割り当て color=gdImageColorExact(im_new,p,p,p); //im_new の (i,j) におけるピクセル値を color で設定 gdImageSetPixel(im_new,i,j,color); } } gdImageJpeg(im_new,out,-1); fclose(in); fclose(out); return 0; }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。