###前提・実現したいこと
微分フィルタの1つであるsobelフィルタを用いてPGM形式の濃淡画像をエッジ画像に出力したい.
###発生している問題・エラーメッセージ
画像が真っ暗になる.
###該当のソースコード
C
1 2void EdgeDetection(void){ 3 4 int iWidth = 0, iHeight = 0, iMaxValue = 0; // 画像の幅,高さ,解像度 5 int *piOutputData = NULL; // 画像処理したデータを格納 6 7 8 9 int i,j,k,l = 0; 10 int sobel_x[9]={-1,0,1, 11 -2,0,2, 12 -1,0,1}; 13 int sobel_y[9]={-1,-2,-1, 14 0, 0, 0, 15 1,2,1}; 16 double sum_x,sum_y; 17 double sum; 18 int max; 19 float para; 20//ファイル入力 21 piOutputData=ReadPgm(&iWidth,&iHeight,&iMaxValue); 22 //微分フィルタ 23 for(i=1;i<iHeight-1;i++){ 24 for(j=1;j<iWidth-1;j++){ 25 26 sum_x=0; 27 sum_y=0; 28 sum=0; 29 for(k=0;k<3;k++){ 30 for(l=0;l<3;l++){ 31 sum_x+=sobel_x[3*k+l]*piOutputData[(i+k-1)*iWidth+(j+l-1)]; 32 sum_y+=sobel_y[3*k+l]*piOutputData[(i+k-1)*iWidth+(j+l-1)]; 33 } 34 } 35 36 sum=sqrt(pow(sum_x,2.0)+pow(sum_y,2.0)); 37 // printf("%f\n",sum); 38 piOutputData[i*iWidth+j]=sum; 39 } 40 } 41 42 //最大輝度値を走査 43 max=piOutputData[0]; 44 for(i=1;i<iWidth*iHeight;i++){ 45 if(max<piOutputData[i]) 46 max=piOutputData[i]; 47 } 48 49 //スケール変換のパラメータ 50 para=255/max; 51 52 //スケール変換 53 for(j=0;j<iHeight*iWidth;j++){ 54 piOutputData[j]=para*piOutputData[j]; 55 } 56 57 //ファイルへ出力 58 WritePgm(piOutputData,iWidth,iHeight,iMaxValue); 59//ファイル領域解放 60 FreePgm(piOutputData); 61 62}
###試したこと
3,4つ目のfor文のpiOutputDataの添え字の計算方法を変更した.
###補足情報(言語/FW/ツール等のバージョンなど)
C言語により実装する.
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/08 14:53
2017/12/08 15:11
2017/12/08 15:42
2017/12/08 16:50
2017/12/09 00:44
2017/12/09 02:51
2017/12/09 05:20