画像処理に関する問題です。大津の2値化をC言語で実現するという問題なのですが以下に貼ってある2値化のプログラムに大津の2値化を組み込むならどこに、どのような文を書けばよいのでしょうか? ソースコードとともに教えていただきたいです。使える画像は.ppm形式のもののみで、模範解答としてLenna.ppmという画像を使用した際にはしきい値が116になるそうです。よろしくおねがいします。 #include <stdio.h> #include <string.h> #define MAX 3000 #define RGB 3 #define NAME 50 #define B 172 int X,Y,KAICHO; double gazou[MAX][MAX][RGB]; double gazou2[MAX][MAX]; char filename[NAME]; void input(char fname[NAME],double p[MAX][MAX][RGB]) { int i=0,x,y,z,data; FILE *fp; char A[4][100],unnec[100]; fp=fopen(fname,"r"); for(;;){ fscanf(fp,"%s",A[i]); if(strcmp(A[i],"#")==0)fgets(unnec,100,fp); else i++; if(i==4)break; } sscanf(A[1],"%d",&X); sscanf(A[2],"%d",&Y); sscanf(A[3],"%d",&KAICHO); for(y=0; y<Y; y++) for(x=0; x<X; x++) for(z=0; z<RGB; z++){ fscanf(fp,"%d",&data); p[y][x][z]=(double)data; } fclose(fp); } void output_p2(char fname[NAME],double p[MAX][MAX]) { int x,y,z; FILE *fp; fp=fopen(fname,"w"); fprintf(fp,"P2¥n%d %d¥n%d¥n",X,Y,KAICHO); for(y=0; y<Y; y++) for(x=0; x<X; x++){ fprintf(fp,"%d ",(int)p[y][x]); } fclose(fp); } int main() { int i,j; double g; char fname[NAME]; printf("Input a file name¥n"); scanf("%s",filename); input(filename,gazou); for(i=0;i<Y;i++) for(j=0;j<X;j++){ g=0.299*gazou[i][j][0]+0.587*gazou[i][j][1]+0.114*gazou[i][j][2]; if(g>255){ gazou2[i][j]=255; }else{ gazou2[i][j]=g; } } for(i=0;i<Y;i++){ for(j=0;j<X;j++){ if(gazou2[i][j]<B) gazou2[i][j]=0; else{ gazou2[i][j]=255; } } } sprintf(fname,"%s_otu2",filename); output_p2(fname,gazou2); }
C言語関連